卡特兰数

卡特兰数又称卡塔兰数,卡特兰数是组合数学中一个常出现在各种计数问题中的数列,关于卡特兰数的题目大多都有一个差不多的套路:对于一个规模为n的问题,先找一个元素固定下来,然后将剩下的n-1个元素拆分成两个子问题,最后通过乘法原理和加法原理结合起来,所以卡特兰数的递推式就是f(n) = f(0)*f(n-1) + f(1)*f(n-2) + f(2)*f(n-3)......+f(n-1)*f(0).将公式变形,可以得到f(n) = f(n-1)*(4*n-2) / (n+1).还有两个组合公式:f(n) = C(2n,n)/(n+1) = C(2n,n) - C(2n,n+1).它的前几项为1,2,5,14,42,132......

例1:二叉树的计数

已知一颗二叉树有n个节点,问:该二叉树能组成多少种不同的形态?

分析:常规套路,先选一个点当根节点,用f(n)表示n个节点的二叉树不同的形态数,假设左子树有i个节点,右子树有n-i-1个节点,那么根据乘法原理,就有f(i)*f(n-i-1)种方案.把每个点为根的方案数加起来就是答案:f(n) = Σf(i)*f(n-i-1).

例2:AB排列问题

有n个A和n个B排成一排,从第1个位置开始到任何位置,B的个数不能超过A的个数,问:这样的排列有多少种?

分析:从公式入手.符合要求的排列数=总的排列数-不符合要求的排列数.因为要在2n个位置中选择n个位置放A,所以总的排列数为C(2n,n).再来看如何求不符合要求的排列数.首先肯定是要找不符合要求的排列有什么特征,一个不符合要求的排列的特征是:存在一个奇数位2*k+1,有k+1个B,k个A,根据这个还不能得到答案.将2*k+2到n*2位上的A,B互换一下,可以发现最后得到的排列一定是有n+1个B,n-1个A的,也就是说一旦一个排列经过这种操作后有n+1个B,那么这个排列就是不合法的,因为变换前的排列和变换后的排列是一一对应的,我们只需要求出变换后的排列有多少种,就能知道变换前的排列有多少种.即C(2n,n+1)种,答案为C(2n,n)-C(2n,n+1).正好就是卡特兰数.

例3:字符串(例2的加强版)

例4:乘法加括号:对于连乘a1*a2*a3*......*an,加了括号后就可改变它的运算顺序。问:有多少种不同的运算顺序.

分析:常规套路,先选一个乘号当根节点,构造二叉树,乘号左边就是它的左子树,乘号右边就是它的右子树,剩下的就转化为了例1.

例5:欧拉多边形分割问题:设有一个凸多边形,可以用n-3条不相交的对角线将n边形分成n-2个互相没有重叠的三角形,例如n=5,有5种方法.

分析:还是要先找一个元素给固定下来,选择1号点和n号点,再选择i号点,那么这3个点组成的三角形就会把n变形划分成两个多边形:k边形和n-k+1边形.这就是类卡特兰数了.最后的答案为f(n) = Σf(k)*f(n-k+1).

总结:卡特兰数问题的突破口就是公式,要么通过递推公式,要么通过组合公式.要会用计数问题中的一些常用技巧,比如取补集,转换找特征等等.

posted @ 2017-11-21 15:31  zbtrs  阅读(376)  评论(0编辑  收藏  举报