Catalan数--卡特兰数

一、Catalan数的定义令h(1)=1,Catalan数满足递归式:h(n) = h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1),n>=2该递推关系的解为:h(n) = C(2n-2,n-1)/n=C(2n,n)-C(2n,n-1),n=1,2,3,...(其中C(2n-2,n-1)表示2n-2个中取n-1个的组合数);

 

二、卡特兰数的应用:应用卡特兰数主要是找出递推关系式

1、括号化问题。

  矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)

       将矩阵链乘从k处分裂,所以递推式为:h(n)=h(1)*h(n-1)+h(2)*h(n-2)+...+h(n-1)*h(1);

2、出栈次序问题。

  一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?

      对于每一个数来说,必须进栈一次、出栈一次。我们把进栈设为状态‘1’,出栈设为状态‘0’。n个数的所有状态对应n个1和n个0组成的2n位二进制数。由于等待入栈的操作数按照1‥n的顺序排列、入栈的操作数b大于等于出栈的操作数a(a≤b),因此输出序列的总数目=由左而右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数的方案种数。 S表示入栈,X表示出栈,那么合法的序列有多少个(S的个数为n)
显然有c(2n, n)个含S,X各n个的序列,剩下的是计算不允许的序列数(它包含正确个数的S和X,但是违背其它条件).

     不符合要求的数的特征是由左而右扫描时,必然在某一奇数位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位数必对应一个不符合要求的数。

      这个对应说明,不允许的序列的个数是c(2n, n-1),因此Cn = c(2n, n) - c(2n, n-1)=C(2n,n)/(n+1);

       类似问题:a、有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)

       b、n个1和n个0组成一个2n位的二进制数,要求从左到右扫描,0的累计数不小于1的累计数,试求满足条件的的数

       c、12个人排成两排,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?(2012淘宝笔试题)(我们先把这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序列有多少个。与情况b一样。

3、将多边行划分为三角形问题。

  将一个凸多边形区域分成三角形区域的方法数?

       递推式为:对于n+1边形,以V(1)V(n+1)作为三角形的一条边,三角形的另一个顶点为V(k),k=2,3,...n,三角形V(1)V(n+1)V(k)将n+1边形分割成一边为k边形,另一边为n-k+2边形,所以以V(1)V(n+1)V(k)为一划分三角形的划分数位C(k)*C(n-k+2),C(n+1)=C(2)*C(n)+C(3)*C(n-1)+...+C(n-1)*C(3)+C(n)*C(2)=C(2n-2,n-1)/(n-1);

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


 

4、给定节点组成二叉树的问题。

  给定N个节点,能构成多少种形状不同的二叉树?
  (一定是二叉树!
  先取一个点作为顶点,然后左边依次可以取0至N-1个相对应的,右边是N-1到0个,两两配对相乘,就是h(0)*h(n-1) + h(2)*h(n-2) +  + h(n-1)h(0)=h(n))
  (能构成h(N)个)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值