T3 / 卡特兰数
学习一下卡特兰数
卡特兰数实际上就是一大类问题划归得到的一个结论
其通式:
Hn=n+1(n2n) (n≥2,n∈N∗)
递推式:
Hn=⎩⎪⎪⎨⎪⎪⎧1i=0∑n−1HiHn−i−1n=0,1n≥2,n∈N+
下式还可写作∑i=1nHi−1Hn−i,总之两下标和为n−1的两数卷起来
数列前几项:
Hn=1,1,2,5,14,42,⋯
两式互相转化不易证,咕
一些例子
非降路径计数
求从原点走到在平面直角座标系上的y=x直线上的整点的方案数,且只能向上或向右走
打表发现数列符合1,1,2,5,⋯,于是卡特兰
栈
入栈顺序由1到n,求所有可能的出栈顺序的总数
法一:打表观察,发现数列符合1,1,2,5,⋯
法二:考虑n入栈的时机,前n−1个数出栈i,i∈[0,n−1]个后进入,那么已出栈数列的方案数为ai,加入n后数列的出栈方案数为an−i−1,由于前n−1个数随意组合,考虑乘法原理:
an=i=0∑n−1aian−i−1
故为卡特兰数列
二叉树计数
求有n个节点的(无标号)二叉树的种数
对于有n个节点的(无标号)二叉树,考虑一个根节点,左儿子有i,i∈[0,n−1]个节点,右儿子则有n−i−1个节点,考虑乘法原理:
Sn=i=0∑n−1SiSn−i−1
故为卡特兰数列
T3 概率论
对于一棵随机生成的n个结点的有根二叉树(所有互相不同构的形态等概率出现),它的叶子节点数的期望是多少呢?
考虑树个数,由上文知为卡特兰数列,树个数记为fi
记树叶子节点数为gi
考虑n个结点的二叉树的得到:由n−1个结点的二叉树加上一个叶子节点得来
不同的n−1二叉树上加的叶子节点是不一样的,如:
所以gi=nfi−1
于是期望:
E=figi=finfi−1=n+1(n2n)nn(n−12n−2)=2(2n−1)n(n+1)
Prod概率论
#include<bits/stdc++.h>
using namespace std;
int main(){
double n;
scanf("%lf",&n);
n=n*(n+1)/(2*(2*n-1));
printf("%.9lf",n);
return 0;
}