卡特兰数Catalan

来源:互联网 发布:2017淘宝不好做 编辑:程序博客网 时间:2024/04/19 18:33

1.卡特兰数的性质

这里写图片描述

其实重要的就两个公式:1和3.

公式1是卡特兰数的通项公式。
公式2是卡特兰数的递归公式。注意递推公式是C n+1=…
通常是发现问题可以用卡特兰数的递推公式来解决,从而想到卡特兰数。

2.经典问题

1.出栈次序问题。 
一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?
解:对于每一个数来说,必须进栈一次、出栈一次。我们把进栈设为状态‘1’,出栈设为状态‘0’。n个数的所有状态对应n个1和n个0组成的2n位二进制数。由于任意时刻,出栈的操作数一定不超过入栈的操作数,因此输出序列的总数目为由左而右扫描由n个1和n个0组成的2n位二进制数中,1的累计数不小于0的累计数的方案种数。

2n位二进制数中填入n个1的方案数为c(2n,n)。从中减去不符合要求(由左而右扫描,0的累计数大于1的累计数)的方案数即为所求。

不符合要求的数的特征是由左而右扫描时,必然在某一奇数位2m+1位上首先出现m+1个0的累计数和m个1的累计数,此后的2(n-m)-1位上有n-m个1和n-m-1个0。如若把后面这2(n-m)-1位上的0和1互换,使之成为n-m个0和n-m-1个1,结果得1个由n+1个0和n-1个1组成的2n位数,即一个不合要求的数对应于一个由n+1个0和n-1个1组成的排列。

反过来,任何一个由n+1个0和n-1个1组成的2n位二进制数,由于0的个数多2个,2n为偶数,故必在某一个奇数位上出现0的累计数超过1的累计数。同样在后面部分0和1互换,使之成为由n个0和n个1组成的2n位数,即n+1个0和n-1个1组成的2n位数必对应一个不符合要求的数。

因而不合要求的2n位数与n+1个0,n-1个1组成的排列一一对应。

显然,不符合要求的方案数为C(2n,n+1)。由此得出输出序列的总数目为C(2n,n) - C(2n,n+1) = 1/(n+1)*C(2n,n)。

2.括号化问题

一个有n个X和n个Y组成的字串,且所有的部分字串皆满足X的个数大于等于Y的个数。以下为长度为6的Dyck word:
XXXYYY , XYXXYY , XYXYXY , XXYYXY ,XXYXYY
将上例的X换成左括号,Y换成右括号,Cn表示所有包含n组括号的合法运算式的个数:
((())) , ()(()) , ()()() (())() , (()())

解:这个题目只要将上面证明过程中的1对应左括号,0对应右括号即可。

3.二叉树问题

有N个节点的二叉树共有多少种情形? n个节点的二叉树的所有可能形态数为Cn。

类似题目:
n个非叶节点的满二叉树的形态数(对称后得到的二叉树除非自己本身对称,否则算是不同)。
这里要求满二叉树,实际上就是在上一点的每个子节点的空儿子上都加上叶子,就形成了我们的图了,那么我们要求的结果就是Catalan数。
这里写图片描述

解1:(2)中的每个不同的括号串,一 一映射于二叉树的每一种情况。
解2:用递推公式可能更容易理解
设n个节点的二叉树有F(n)个,则分为根的左子树0各节点、右子树n-1个节点,跟的左子树1个节点、右子树n-2个节点,…:

F(n)= F(0)*F(n-1)+ F(1)*F(n-2)+ … + F(n-1)*F(0)= Cn。

4.将多边行划分为三角形问题。
n+1边形进行三角形分割(只连接顶点对形成n个三角形)数:
这里写图片描述

这里写图片描述

5. n×n格点中不越过对角线的单调路径的个数
Cn表示所有在n × n格点中不越过对角线的单调路径的个数。一个单调路径从格点左下角出发,在格点右上角结束,每一步均为向上或向右。计算这种路径的个数等价于计算Dyck word的个数: X代表“向右”,Y代表“向上”。下图为n = 4的情况:
这里写图片描述
解:我们将一条水平边记为1,垂直边记为0,那么就组成了一个n个,1和n个0的序列,同(1)。

6.阶梯切割问题

n层的阶梯切割为n个矩形的切法数也是Cn。如下图所示:
这里写图片描述

7.填数问题

在一个2*n的格子中填入1到2n这些数值使得每个格子内的数值都比其右边和上边的所有数值都小的情况数也是Cn。
或者
12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
解:我们先把这12个人从低到高排列,然后,选择6个人排在第一排,那么剩下的6个肯定是在第二排.
用0表示对应的人在第一排,用1表示对应的人在第二排,那么含有6个0,6个1的序列,就对应一种方案.
比如000000111111就对应着
第一排:0 1 2 3 4 5
第二排:6 7 8 9 10 11
010101010101就对应着
第一排:0 2 4 6 8 10
第二排:1 3 5 7 9 11
问题转换为,这样的满足条件的01序列有多少个。
观察1的出现,我们考虑这一个出现能不能放在第二排,显然,在这个1之前出现的那些0,1对应的人
要么是在这个1左边,要么是在这个1前面。而肯定要有一个0的,在这个1前面,统计在这个1之前的0和1的个数。
也就是要求,0的个数大于1的个数。

8.电影院买票问题:

有2n个人排队进电影院,票价是50美分。在这2n个人当中,其中n个人只有50美分,另外n个人有1美元(纸票子)。愚蠢的电影院开始卖票时1分钱也没有。问:有多少种排队方法使得每当一个拥有1美元买票时,电影院都有50美分找钱。(注:1美元=100美分拥有1美元的人,拥有的是纸币,没法破成2个50美分。)
解:50美分设为‘0’,1美元设为‘1’,构成任何子序列‘0’不比‘1’少的序列即可。跟(1)类似,Cn。

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

思路:以其中一个点为基点,编号为0,然后按顺时针方向将其他点依次编号。那么与编号为0相连点的编号一定是奇数,否则,这两个编号间含有奇数个点,势必会有个点被孤立,即在一条线段的两侧分别有一个孤立点,从而导致两线段相交。设选中的基点为A,与它连接的点为B,那么A和B将所有点分成两个部分,一部分位于A、B的左边,另一部分位于A、B的右边。然后分别对这两部分求解即可。
设问题的解f(n),那么f(n) = f(0)*f(n-2) + f(2)*f(n-4) + f(4)*f(n-6) + ……f(n-4)*f(2) + f(n-2)*f(0)。f(0)*f(n-2)表示编号0的点与编号1的点相连,此时位于它们右边的点的个数为0,而位于它们左边的点为2n-2。依次类推。
f(0) = 1, f(2) = 1, f(4) = 2。结合递归式,不难发现f(2n) 等于C(n)。

参考:
小思Catalan数
Catalan数——卡特兰数
从《编程之美》买票找零问题说起,娓娓道来卡特兰数——兼爬坑指南

1 0
原创粉丝点击