组合数学 Catalan Number 总结

因缘:在某一次做题过程中遇到了 C(2n,n)/(n+1) ,C(2n,n)在计算过程中中间值太大导致爆掉令我非常头痛,那有什么方法能够解决这个问题呢?
解决方法就是Catalan数。


简介:

卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名。
其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...


历史:

·1758年,Johann Segner 给出了欧拉问题的递推关系;
·1838年,研究热潮:
–GabrielLame给出完整证明和简洁表达式
–EugèneCharlesCatalan在研究汉诺塔时探讨了相关问题,解决了括号表达式的问题.
–……
–1900EugenNetto在著作中将该数归功于Catalan.
·1988年以及1999年的文献研究表明实际上最初发现Catalan数的也不是Euler,
–1753欧拉在解决凸包划分成三角形问题的时候,推出了Catalan数。
1730年我国清朝时期的明安图(蒙古人)比Catalan更早使用了Catalan数,见《割圜密率捷法》。后来他的学生在1774年将其完成发表。
最后由比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名
组合数学 Catalan Number 总结_第1张图片


原理:

h(0)=1,h(1)=1,Catalan数满足
递推式
1. h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)
2. h(n)=h(n-1)*(4*n-2)/(n+1);

递推关系的为:
1. h(n)=C(2n,n)/(n+1) (n=0,1,2,...)
2. h(n)=C(2n,n)-C(2n,n-1)(n=0,1,2,...)


(上面都是百度百科,下面的才有点意思组合数学 Catalan Number 总结_第2张图片)


接下来是Catalan Number的7个常见应用

PS: h(n)代表Catalan数列。

----------------------------------------------------------------------------------------------------------------------------------------------------------
1.n对括号有多少种匹配方法

思路:n对括号相当于有2n个字符,n个左括号字符,n个右括号字符,设问题的解为f(2n)。第0个括号一定是左括号,与之匹配的一定是第2*i+1个字符,因为括号内不能包含奇数个字符。

每次都把问题划分成 f(i) 和 f(2n-i-2)两个步骤,先完成f(i),再完成f(2n-i-2)。

例如:2n个字符中第0个字符和第1个字符匹配,中间间隔0个字符的匹配方法为f(0)种,剩余2n-2个字符,2n-2个字符匹配方法为f(2n-2)
  2n个字符中第0个字符和第3个字符匹配,中间间隔2个字符的匹配方法为f(2)种,剩余2n-4个字符,2n-4个字符匹配方法为f(2n-4)
......

转化成递归式: f(2n)=f(0)*f(2n-2)+f(2)*f(2n-4)+f(4)*f(2n-6)+...+f(2n-4)*f(2)+f(2n-2)*f(0)。
初始值f(0)=1,中间没有括号字符只能是1种情况
f(2)=1
f(4)=2
f(6)=5
......
可以观察发现f(2n)是Catalan数,即f(2n)=h(n)
----------------------------------------------------------------------------------------------------------------------------------------------------------
2.矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?

思路:设对于矩阵链乘P=a1×a2×a3×……×an,依据乘法结合律,不改变顺序,有f(n)种括号化的方案。
把P划分成两部分,例如(a1)×(a2×a3×……×an)然后再对两个部分继续划分。

转化成递归式: f(n)=f(1)*f(n-1)+f(2)*f(n-2)+f(3)*f(n-3)+……+f(n-3)*f(3)+f(n-2)*f(2)+f(n-1)*f(1)

f(1)=1
f(2)=1
f(3)=2
f(4)=5
......
可以从f(n)的值和表达式的形式上知道这是Catalan数,f(n)=h(n-1)
----------------------------------------------------------------------------------------------------------------------------------------------------------
3.一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
思路:ok,这个问题可以联系到问题1,把每个元素进栈看作 ( ,出栈看作 ),n个数的入栈次序和出栈次序构成了一个2n个数字的序列(0~2n-1),因此设n个元素的序列不同出栈序列方式有f(2n)种。
依照问题1的解决方式,对于第0个数字,必然是入栈,那么它出栈的操作一定是2i+1(i是数字编号,编号从0开始)。

把问题划分成 f(i) 和 f(2n-i-2)两个步骤,先完成f(i),再完成f(2n-i-2)。

例如 2n次操作中第0次入栈 第1次出栈,中间间隔0次操作,操作方法为f(0)种,剩余2n-2次操作,2n-2次操作方法为f(2n-2)
2n次操作中第0次入栈 第3次出栈,中间间隔2次操作,操作方法为f(2)种,剩余2n-4次操作,2n-4次操作方法为f(2n-4)
......
转化成递归式f(2n)=f(0)*f(2n-2)+f(2)*f(2n-4)+f(4)*f(2n-6)+...+f(2n-4)*f(2)+f(2n-2)*f(0)。

初始值f(0)=1,中间没有操作只能是1种情况,先入栈紧接着出栈
f(2)=1
f(4)=2
f(6)=5
......
即f(n)=h(n-1)
----------------------------------------------------------------------------------------------------------------------------------------------------------
4.n个节点构成的二叉树,共有多少种情形?

思路:根节点会占用1个节点,剩下了n-1个节点,这n-1个节点有如下分配方式:
左子树 右子树
n-1 0
n-2 1
n-3 2
......
2 n-3
1 n-2
0 n-1
设T(a,b) 代表左子树分配a个节点,右子树分配b个节点
设f(n) 代表有多少种由n个节点构成的二叉树

根据上面的推导可以得到:
f(n)=f(n-1)*f(0)+f(n-2)*f(1)+f(n-3)*f(2)+......+f(2)*f(n-3)+f(1)*f(n-2)+f(n-1)*f(0)

OhohOh 原来是这样 原来是Catalan数,所以呢 f(n)=h(n)

----------------------------------------------------------------------------------------------------------------------------------------------------------
5.在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?

思路:还是和括号匹配相似,可以思考一下,如果从圆上2n个点随便选择一个点A,它和其他点B相连,然后直线AB将圆切割成了两部分,现在选择其中一部分,如果点A和点B中间有奇数个点,那么剩下的奇数个点中

两两连线必然会剩下一个点,然后另一侧也必然会剩下一个点,这样就会有一个直线与另外一些直线相交,很显然不行,因此,点A和点B之间只能有偶数个点。

ok,现在设圆上2n个点从0开始到2n-1,顺时针分布。先找到A和B点,然后对直线AB分割成两部分进行处理即可。

设f(2n)为圆上2n个点成对连接所得到的n条线段不相交的方法数
例 假设A点是0,那B点只能是2i+1,由AB分割成的两部分中其中一部分有2i个点,另一部分自然是2n-2i-2个点,因为AB这两个点也要去掉,因此可以写成:
f(2n)=f(0)*f(2n-2)+f(2)*f(2n-4)+f(4)*f(2n-6)......+f(2n-4)*f(2)+f(2n-2)*f(0)

把2n替换成t后
f(t)=f(0)*f(t-1)+f(1)*f(t-2)+......+f(t-2)*f(1)+f(t-1)*f(0)
很明显的Catalan数递推公式
因此f(2n)=h(n)
----------------------------------------------------------------------------------------------------------------------------------------------------------
6.求一个凸多边形区域划分成三角形区域的方法数?

思路:以多边形一条边为底,设这条边的两个顶点是A和B。从剩余凸多边形顶点中选取一个顶点作为三角形的第三个顶点,这样就把一个凸多边形划分成了一个三角形和两个小凸多边形,然后求解两个凸多边形。

设f(n)为n个顶点凸多边形可划分成三角形区域的方法数,

顺时针设置凸多边形顶点编号分别是0~n-1,假设开始设置A为0,B为1,C从剩下n-2个点中选择一个,这样划分出来两个小凸多边形,一个顶点数为i ( i>=2 ),另一个顶点数则为(n-i+1),因此
f(n)=f(2)*f(n-1)+f(3)*f(n-2)+......+f(n-2)*f(3)+f(n-1)*f(2)

f(2)=1,假如n=4,在划分时会划分成两个三角形,也就相当于其中一个凸多边形是不存在的。
f(3)=1
f(4)=2
f(5)=5
......
f(n)=h(n-2)
----------------------------------------------------------------------------------------------------------------------------------------------------------
7.有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?

思路:如果想有10元的人买票就有5元的钞票找零,那么在前i个人中有5元的人数>=有10元的人数。也就是说,有一个10元就要有一个5元,把问题转化一下,将5元视为( ,10元视为 ),每一个右括号必须对应一个左括号,因此此问题就转化成了问题1.n对括号有多少种匹配方法。

所以f(2n)=h(n)。
----------------------------------------------------------------------------------------------------------------------------------------------------------


**可以发现,上述问题都是划分问题找到递推式然后解决掉。


练习题:

HDU 2067  题解
HDU 1134  题解
HDU 1023  题解
HDU 1130  题解
HDU 1133

......

你可能感兴趣的:(۩۩.._ACM)