acm-Catalan(卡塔兰数)

参考博客:http://blog.csdn.net/wuzhekai1985/article/details/6764858


表示用下面的方法把凸多边形区域分成三角形区域的方法数:在有n+1条边的凸多边形区域内通过插入在其中不相交的对角线而把它分成三角形区域。定义。则满足递推关系

         

              

 

这个递推关系的解是:,这里的叫做Catalan数

 

 

那么上面的递推式的正确性我们可以简单描述一下即可:

证明:这里因为表示按照上述规则划分的三角形区域个数,那么我们随便选一条多边形的一条边作为基边,那么

     再在剩余的n-1个点中选一个点,我们把所选的一条边的两点分别与所选的那一点连接起来,那么多边形被划

     分成3部分,一部分有k+1条边,一部分有3条边,另一部分有n-k+1条边,那么这样就划分成了子问题了,所

     以按照这个思路可以证明递推式成立。

 

那么根据递推式是如何推出Catalan数的通项公式呢?

 

这里用到了生成函数:我们很容易写出的生成函数

 

我们进一步计算

 

 

因为有:,所以进一步得到:

 

,由于

 

所以有:,解之得到:

 

,另一个解不符合,舍去。

 

那么根据牛顿二项式有:

 

 

 

那么带入化简得到:

 

 

那么我们最终得到:

 

所以:,这就是Catalan的推导过程

 

 

 

卡特兰数的应用

      

1、括号化问题

 

矩阵连乘:,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,问有几种括号化的方案?

(h(n))

例如abcd ((ab)c)d,(a(bc))d,....

       

  思路: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)

 

2、出栈次序问题

 

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

 

  思路:可以这样考虑,首先通过括号化,将P分成两个部分,然后分别对两个部分进行括号化。比如分成(a1)×(a2×a3.....×an),然后再对(a1)和(a2×a3.....×an)分别括号化;又如分成(a1×a2)×(a3.....×an),然后再对(a1×a2)和(a3.....×an)括号化。

       设n个矩阵的括号化方案的种数为f(n),那么问题的解为

        f(n) = f(1)*f(n-1) + f(2)*f(n-2) + f(3)*f(n-3) + f(n-1)*f(1)。f(1)*f(n-1)表示分成(a1)×(a2×a3.....×an)两部分,然后分别括号化。

       计算开始几项,f(1) = 1, f(2) = 1, f(3) = 2, f(4) = 5。结合递归式,不难发现f(n)等于h(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个人排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

我们先把这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个节点,能构成多少种形状不同的二叉树?

思路:可以这样考虑,根肯定会占用一个结点,那么剩余的n-1个结点可以有如下的分配方式,T(0, n-1),T(1, n-2),...T(n-1, 0),设T(i, j)表示根的左子树含i个结点,右子树含j个结点。

       设问题的解为f(n),那么f(n) = f(0)*f(n-1) + f(1)*f(n-2) + .......+ f(n-2)*f(1) + f(n-1)*f(0)。假设f(0) = 1,那么f(1) = 1, f(2) = 2, f(3) = 5。结合递推式,不难发现f(n)等于h(n)

     

4.n*n棋盘从左下角走到右上角而不穿过主对角线的走法

 

5.n个+1和n个-1构成的2n项序列,其部分和总满足:的序列的个数。

 

Catalan数的高精度处理:利用递归式: h(n)=((4*n-2)/(n+1))*h(n-1)


6.凸多边形三角形划分:在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)。

比如当n=6时,f(6)=14.h(n-1)


7.在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?h(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) 等于h(n)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章