卡特兰数
卡特兰数(Catalan Numbers)是组合数学中经常出现在各种计数问题中的数列,前几项为:1,2,5,14,42,132,429,1430,4826,16796。
递推关系
令h(0)=h(1)=1,那么卡特兰数满足递推式:
h(n) = h(0) * h(n-1) + h(1) * h(n-2) + ... + h(n-1) * h(0) (n>=2)
也可表示成:
h(n) = h(n-1) * (4n-2) / (n+1) (n>=1)
对上述递推式求解,可得通项公式:
h(n) = C(2n,n) / (n+1) (n>=0)
也可以写成:
h(n) = C(2n,n) - C(2n,n-1) (n>=0)
要计算卡特兰数,简单的做法是根据递推式直接推。
#include <stdio.h>
typedef long long LL;
LL h[30] = {1, 1};
int main() {
int i;
for (i = 2; i <= 30; i++)
h[i] = h[i-1] * (4 * i - 2) / (i + 1);
return 0;
}
由于增长较快,int64范围内所能表示的最大卡特兰数为h(33),往后的卡特兰数需用高精。
卡特兰数的应用
- n对括号构成有效括号序列的方案数
- n个节点构成有效二叉查找树的方案数
- 含有n+1个叶子节点的满二叉树方案数
- 通过顶点连线的方式将凸n+2边形划分成三角形的方案数
- n个节点构成二叉树的方案数
- 在n*n的方格中,不允许穿过主对角线,从左下角走到右上角的路径数
- 将n对括号插到长度为n+1的字符串构成有效序列的方案数