卡特兰数又称卡塔兰数 (Catalan Number),是组合数学中一个经常出现在各种计数问题中的数列。其前几项为:

1
2
5
14
42
132
429
1430
4862
16796
58786
208012
742900
...

公式

求卡特兰数列的第n项

公式1
$$
f(n)=\sum_{i=0}^{n-1}f(i)\times f(n-i-1)
$$

公式2
$$
f(n)=\frac {f(n-1)\times(f\times n-2)}{n+1}
$$

公式3
$$
f(n)=\frac{C_{2n}^{n}}{n+1}
$$

公式4
$$
f(n)=C_{2n}^{n}-C_{2n}^{n-1}
$$

应用

卡特兰数经常出现在OI以及ACM中,在生活中也有广泛的应用。

进出栈问题

栈是一种先进后出(FILO,First In Last Out)的数据结构

那么一个足够大的栈的进栈序列为1,2,3,⋯,n时有多少个不同的出栈序列?

假设k为最后一个出栈的元素。比k早进栈且早出栈的有k-1个数,一共有f(k-1)种方案。比k晚进栈且早出栈的有n-k个数,一共有f(n-k)种方案。所以一共有f(k-1)*f(n-k)种方案。当k取不同值时,产生的出栈序列是互相独立的,因此可累加。因为k的取值范围是1~n,所以结果为
$$
f(n)=f(0)\times f(n-1)+f(1)\times f(n-2)+…+f(n-1)\times f(0)
$$
注意:n>=2

例题:P1044 栈

long long f[N];
f[0]=f[1]=1;
cin>>n;
for(int i=2; i<=n; i++)
for(int k=0; k<i; k++)
f[i]+=f[k]*f[i-k+1];
cout<<f[n]<<endl;

二叉树的计数

已知一颗二叉树有n个结点,问:该二叉树能组成多少种不同的形态?

假设如果采用中序遍历的话,根结点第k个被访问到,则根结点的左子树有k-1个点、根结点的右指数有n-k个点。k的取值范围为1到n。明显的卡特兰数。

AB排列问题

有n个A和n个B排成一排,从第1个位置开始到任何位置,B的个数不能超过A的个数,这样的排列有多少种?

如:

n=1: AB

n=2: AABB ABAB

n=3: AAABBB AABABB AABBAB ABAABB ABABA

在n*n的格子中,只在下三角行走,每次横或竖走一格,有多少种走法?

向右走相当于进栈(A),向左走相当于出栈(B),本质就是n个数出栈次序的问题。

AB排列问题

乘法加括号

NOI 1988

对于连乘:
$$
a[0]\times a[1]\times a[2]\times …\times a[n]
$$
加了括号后可以改变它的运算顺序,问有多少种不同的运算顺序?

将其表示成一颗二叉树,把*逐个作为根,得到卡特兰数。

参考文献&网址