卡特兰数数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中的数列,其前几项为:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, …
令h(0) = 1,h(1) = 1,catalan数满足递推式:
h ( n ) = h ( 0 ) ∗ h ( n − 1 ) + h ( 1 ) ∗ h ( n − 2 ) + … + h ( n − 1 ) ∗ h ( 0 ) ( n > = 2 ) h(n) = h(0)*h(n-1)+h(1)*h(n-2)+…+h(n-1)*h(0) (n>=2) h(n)=h(0)∗h(n−1)+h(1)∗h(n−2)+…+h(n−1)∗h(0)(n>=2)
例如:
h(2) = h(0)*h(1)+h(1)*h(0) = 2
C a t a l a n n = 1 n + 1 C ( n , 2 n ) Catalan_n = \frac{1}{n+1} C(n,2n) Catalann=n+11C(n,2n)
也就是:
h(n) = 1 n + 1 \frac{1}{n+1} n+11 * ( 2 n ) ! n ! n ! \frac{(2n)!}{n!n!} n!n!(2n)!
C a t a l a n n + 1 = 4 n + 2 n + 2 C a t a l a n n Catalan_{n+1} = \frac{4n+2}{n+2}Catalan_n Catalann+1=n+24n+2Catalann
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
分析
如果有 n 个元素,在平面直角坐标系中用 x 坐标表示入栈数,y 坐标表示出栈数,则坐标 (a,b) 表示目前已经进行了 a 次入栈和 b 次出栈
那么由 (a,b) 走到 (a+1,b),就意味着又进行一次入栈
那么由 (a,b) 走到 (a,b+1),就意味着有进行一次出栈
又因为入栈数<=出栈数,所以路径图一定不在直线 y=x下面
因此,题目相当于求从 (0,0) 走到 (n,n) 且不跨越直线 y=x 的方案数
首先,从 (0,0) 走到 (n,n),相当于从 2n 次操作中选 n 次进行入栈,则方案数为 C(n,2n)
然后,考虑对于某种不合法的方案,一定在若干次操作后有一次入栈数比出栈数多一次,则最终到达的点是(n-1,n+1)。
也就是说,非法的方案数就是从 (0,0) 走到 (n-1,n+1) 的方案数,C(n+1,2n)。
那么,合法的方案数:C(n,2n) - C(n-1,n+1),化简就得到Catalann
不化简了,背过就行了
类似问题,买票找零
有 2n 个人拍成一行进入动物园,动物园的门票为5元。其中只有 n 个人有一张 5 元钞票,另外 n 人只有 10 元钞票,动物园无其他钞票,问有多少种方法使得只要有 10 元的人买票,售票处就有 5 元的钞票找零?(将持有 5 元钞票的游客买票看作 5 元入栈,持 10 元钞票的人买票看作 5 元出栈)
&esmp;矩阵链乘:P = a1 × a2 ×…×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案:
h(n-1) 种方案
在一个凸多边形种,动过若干条不相交的对角线,把这个多边形划分成了若干个三角形。那么假设凸多边形的边数是 n,求划分的方案数。
方案数:h(n-2)
给定 n 个节点,能构成多少种不同的二叉树?
能构成 h(n) 个
2n个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
排列方式 h(n) 种
参考:从《编程之美》买票找零问题说起,娓娓道来卡特兰数——兼爬坑指南
对于在 n 位的 2 进制中,有 m 个 0,其余为 1 的 Catalan 数为:C(n,m) - C(n,m-1)。