另类递归式: h(n)=((4*n-2)/(n+1))*h(n-1);(用程序实现,用这个公式)
卡塔兰数应用:
1. 矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?
方法1:设P(n)表示n个元素括号化的数目。
方法2:转化为问题2中的括号匹配问题。
2. n对括号有多少种匹配方式?
n对括号相当于有2n个符号,n个左括号、n个右括号,可以设问题的解为f(2n)。第0个符号肯定为左括号,与之匹配的右括号必须为第2i+1字符。因为如果是第2i个字符,那么第0个字符与第2i个字符间包含奇数个字符,而奇数个字符是无法构成匹配的。
通过简单分析,f(2n)可以转化如下的递推式 f(2n) = f(0)*f(2n-2) + f(2)*f(2n - 4) + ... + f(2n - 4)*f(2) + f(2n-2)*f(0)。简单解释一下,f(0) * f(2n-2)表示第0个字符与第1个字符匹配,同时剩余字符分成两个部分,一部分为0个字符,另一部分为2n-2个字符,然后对这两部分求解。f(2)*f(2n-4)表示第0个字符与第3个字符匹配,同时剩余字符分成两个部分,一部分为2个字符,另一部分为2n-4个字符。依次类推。
假设f(0) = 1,计算一下开始几项,f(2) = 1, f(4) = 2, f(6) = 5。结合递归式,可以证明f(2n) 等于h(n)。证明方法参考问题1.
3。
有n个节点的二叉树共有多少种情形?
解:有h(n)种情形
自己的理解:
一共有a0,a1,a2,…,an共n个元素,由它们来构造二叉树。h(n)表示这n个元素一共可以构成h(n)个不同的二叉树。如果选取a0作为根节点,那么其左子树包含0个元素,左子树的数目是h(0);其右子树包含n-1个元素,右子树的数目是h(n-1);以a0为根节点的二叉树的数目是h(0)*h(n-1)。如果选取a1作为根节点,那么其左子树包含1个元素a0,左子树的数目是h(1);其右子树包含h(n-2)个元素,右子树的数目是h(n-2);以a1为根节点的二叉树的数目是h(1)*h(n-2)。如果选取ai作为根节点,其左子树包含i个元素,左子树的数目是h(i);右子树包含n-i-1个元素,右子树数目为h(n-i-1);以ai为根节的二叉树的数目是h(i)*h(n-1-i)。
总的二叉树的数目为h(n)=h(0)*h(n-1)+h(1)*h(n-2)+…+h(i)*h(n-1-i)+…+h(n-1)*h(0)
如果一共有0个节点,那么二叉树的数目为h(0)=1;如果一共有1个节点,那么二叉树的数目为h(1)=1
4、 出栈次序问题
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
对于每个数,必须入栈一次,出栈一次。把入栈设为状态1,出栈设为状态0。n个数的所有状态对应于n个1和n个0组成的2n位二进制数。由于等待入栈的操作数按照1。。。n的顺序入栈,入栈的次数一定大于等于出栈的次数。因此,合法的输出序列是满足下面条件的序列:由左向右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数。
解法1:第0个符号一定是1,否则该序列不合法。假设第0个1和第k个0相匹配,那么从第1个符号到第k-1个符号,从第k+1个符号到第n-1个符号也都是一个合法的序列。可以知道,k一定是一个奇数,设k=2*i+1(i=0,1,2,…,n-1)
假设2n个符号中合法的序列数为f(2n),则f(2n)= ∑f(2i)*f(2n-2*i-2),其中,i=0,1,…,n-1。
下面证明f(2n)=h(n)
1)f(0)=h(0)=1,f(2)=h(1)=1
2)假设当对于小于等于n的任意整数m满足:f(2m)=h(m)
f(2n)= ∑f(2i)*f(2n-2*i-2),其中,i=0,1,…,n-1
=∑h(i)*h(n-i-1),其中,i=0,1,…,n-1
=h(n)
所以,1,2,…,n,共有h(n)种不同的出栈序列
由n个0和n个1组成的满足下面条件的序列总数为h(n):1的个数不小于0的个数。
解法2:证明每个不合法序列与n+1个0和n-1个1组成的序列是一一对应的
不合法的序列从左向右扫描时,必然存在某一位上首先出现m+1个0和m个1(如果第0位是0,那么第0位就是满足条件的为。如果第0位是1,那么第0位上1的个数比0的个数多1,同时因为序列不合法,必然存在某一位上0的个数比1的个数多;所以,一定存在某一位上出现1的个数比0的个数少1)。此后的2n-2m-1位上有n-m个1和n-m-1个0。如果把后边的2n-2m-1位上的0和1互换,使之成为含有n-m个0和n-m-1个1的序列,结果得由n+1个0和n-1个1组成的序列。
反过来,任何一个由n+1个0和n-1个1组成的序列。因为0的个数比1的个数多2,所以必在某一位上出现0的个数比1的个数多1。同样在后面部分0和1互换,使之成为由n个0和n个1组成的序列,即n+1个0和n-1个1组成的序列对应一个不合法的序列。
因此,不合法的2n个数的序列与由n+1个0和n-1个1组成的序列一一对应。
显然,不合法的方案数位C(2n,n-1),由此得出合法的序列数为C(2n,n)
-C(2n,n+1)=C(2n,n)/(n+1)。
5. 买票找零问题
球票为50元,有2n个人排除买票,其中n个人手持50元的钞票,n个人持100元的钞票,假设售票处无零钱,问这2n个人有多少种排列方式,不至于使售票处出现找不开钱的局面。
解:h(n)。和题目1一样,出栈入栈。
6. 凸多边形的三角剖分问题
求将一个凸多边形区域分成三角形区域的方法数。
对于有n条边(n+1个顶点)的多边形的一个三角剖分与具有n-1个叶节点的分析树对应。所以,由n+1个顶点n条边构成多边形的三角剖分数目为h(n-2).
公式:f(n)=f(2)f(n-2+1)+f(3)f(n-3+1)+……+f(n-1)f(2)。
f(2) = 1 , f(3) = 1,f(4)=2,f(5)=5,f(6)=14 …………
7. 上班路径问题
一位律师在住所以北n个街区和以东n个街区工作。每天她走2n个街区去上班。如果她不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
解:h(n)。出栈入栈
8.
圆上的点连线问题
在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?
解:h(n)
9. 12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
这个笔试题,很YD,因为把某个递推关系隐藏得很深。
问题分析:
我们先把这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的个数。
OK,问题已经解决。
如果把0看成入栈操作,1看成出栈操作,就是说给定6个元素,合法的入栈出栈序列有多少个。
这就是catalan数,这里只是用于栈,等价地描述还有,二叉树的枚举、多边形分成三角形的个数、圆括弧插入公式中的方法数,其通项是c(2n, n)/(n+1).
方法2:先给括号标号(序号对应身高),我们把左括号当作第一排的人,右括号当作第二排的人。
我们可以得出括号匹配可以对应到身高排列。还要证反过来也成立。
先明确这里身高对应排列序号,合法的括号匹配就是左右括号数量一致(这里显然),并且前面的“第n个右括号之前必定至少有n左括号”。
对于每一个满足要求的身高排列,
a1 |
< |
a2 |
< |
a3 |
ʌ |
|
ʌ |
|
ʌ |
b1 |
< |
<>b2 |
< |
b3 |
对b1,我们知道身高小于b1的a至少有a1
对于b2,我们知道身高小于b2的a至少有a1,a2
。。。。
我们让a对应(,b对应),而括号的位置序号对应身高序号。
所以可以证明按身高排序的ai 和bi序列,替换成括号后是合法匹配。
10.
先求一道题:n个元素的出栈,入栈合法方案数。
令1表示进栈,0表示出栈,则可转化为求一个2n 位、含n 个1、n 个0的二进制数,满足从左往右扫描到任意一位时,经过的0数不多于1数。显然含n 个1、n 个0的2n 位二进制数共有C(2n,n) 个,下面考虑不满足要求的数目.
考虑一个含n 个1、n 个0的2n位二进制数,扫描到第2m+1 位上时有m+1 个0和m 个1(容易证明一定存在这样的情况),则后面的0-1排列中必有n-m 个1和n-m-1 个0。将2m+2 及其以后的部分0变成1、1变成0,则对应一个n+1 个0和n-1 个1的二进制数。反之亦然(相似的思路证明两者一一对应)。
从而 C(2n,n) / (n + 1 )= C(2n,n)-C(2n, n+1) 。证毕。
以这道题为基础,有
参考:http://blog.csdn.net/yushuai007008/article/details/7693405