Catalan数列
给定n个0和n个1,它们按照某种顺序排列成长度为2n的序列,满足任意前缀和中0的个数都不少于1的个数的序列的数量为:
证明:
令n个0和n个1排成的序列,如果某个位置p前,1的数量等于0的数量+1那么将p+1到2n进行取反整个序列变为n+1个1和n-1个0。
对于任意的n+1个1和n-1个0组成的序列,如果前1到p中1的数量等于0的数量+1,那么将后面的去翻。得到的整个序列就是n个1和n个0排列的某个序列
所以二者一一对应。根据多重集的全排列可知,n个0,n个1排列有,n-1个0,n+1个1有
在来看看其他递推公式
1.
2.
先看第一个递推公式,我们能够确定数列中第一个数一定0。找到一个位置2*i,使得1~2*i里面的0的个数等于1的个数。我们知道序列第一个是0,第2*i个是1。其他的2*i-2位方案数通过子问题就可以知道。从第2i+1位到第2n位又是一个子问题
。以第i位为分界点的卡特兰数就是
只要枚举每个位置i就可以求出第n个卡特兰数
其中
第二个递推公式
单独看
有了这个公式计算卡特兰数只需要一行代码
f[0]=1
for (int i = 1; i <= n; i++) f[i] = f[i - 1] * (4 * i - 2) / (i + 1);
通过上面求解第二个递推式的过程可以发现这个式子是成立的
网友评论