卡特兰数
卡特兰数
首先,我们对卡特兰数的定义如下:
当然, Cn也有通项公式的定义:
卡特兰数的前几项:
卡特兰数,在组合数学里有非常广泛的应用:
1. 凸n边形的三角剖分个数
凸n边形三角剖分后,每一条边都会属于一个三角形。假设,我们将该凸n边形的n个顶点按照顺时针分别标号为1~n。根据之前的分析,边(1,n)一定会属于某个三角形,那么该三角形的第三个顶点一定落在区间[2,3,…,n-1]。假设这个顶点为k,那么就会将原来的凸n边形划分为最多两个凸多边形(可能只有一个):
①以顶点{1, 2, ... , k}构成的k多边形
②以顶点{k, k+1, ..., n}构成的n-k+1多边形
于是,原问题被化解为两个子问题(也有可能只有一个):这两个凸多边形的划分个数是多少?根据“乘法原理”,二者相乘就是边(1,n)与顶点k构成三角形时的三角剖分个数。
最后,因为k可以取值[2,3,…,n-1],所以根据“加法原理”,将当k取不同值时的划分个数全部相加就是最后的答案。
2. 一个长度为n的序列有多少种合法的入栈出栈序列。
另一种问法:一个长度为n的序列有多少种单栈排序后的不同序列。
记:0为入栈、1为出栈,那么一个合法的入栈出栈序列一定满足两个性质:
1) 性质1:0、1个数相等
2) 性质2:任意前缀子序列必须满足0的个数大于等于1的个数
定义:满足以上要求的长度为2n的序列S的个数为f(n),则:
我们现在从序列左边扫描至右边:如果扫描到下标为2k (k=1,2,…,n)处,第一次出现1的个数等于0的个数,即[1,2k]区间的序列0、1个数相同,那么[1,2k-1]区间的序列必定有num(0)-num(1)=1。
因为有性质2,所以S[1]=0(S的下标从1开始)。所以,[2,2k-1]区间的序列,满足性质1和性质2,所以我们找到了一个原问题的子问题:
又因为,k后面的[2k+1, 2n]序列同样满足性质1、2(很容易证明),所以又有一个子问题:
故,根据“乘法原理”:
3. 定义:Dyck word是一个有n个X和n个Y组成的字串,且所有的前缀字串皆满足X的个数大于等于Y的个数。问:一个2n长度的Dyck word有多少个?
比如:长度为6的dyck words:
XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY
分析:X的个数大于等于Y,是不是很像之前的0和1?:)
4. 求:n组括号所组成的合法运算式的个数:
((())) ()(()) ()()() (())() (()())
分析:仔细尝试一下发现:合法的小括号表达式好像只需要满足任意前缀的左括号个数大于等于小括号个数就好了。怎么样?是不是很像之前的X和Y,0和1?
5. 求:所有在n×n格点中不越过对角线的单调路径的个数。
一个单调路径是从格点左下角出发,在格点右上角结束,每一步均为向上或向右。计算这种路径的个数等价于计算Dyck word的个数: X代表“向右”,Y代表“向上”。下图为n = 4的情况:
分析:如果把一条单调路径转化为X和Y的序列,是不是跟之前的第3题很像?:)
6. 求:10个高矮不同的人,站成两排,同一排左低右高,且第二排均高于第一排的排队个数
分析:将10个人按照身高升序排序,如果一个人站第一排记为0,站第二排记为1,我们会发现,不同的排队方式,其实就对应于不同的01序列。并且,我们会发现,符合要求的01序列一定满足:前缀序列的0的个数大于等于1的个数(当前,第一排的人数不少于第二排的人数)。到这里,是不是要回到了之前熟悉的问题?:)
参考博客:
1. http://www.cnblogs.com/JMDWQ/archive/2012/07/08/2581255.html
2. http://blog.csdn.net/ffjjqqjj/article/details/6081711
3. http://blog.csdn.net/hongchangfirst/article/details/8766529