算法学习笔记(7)------catalan数

今天看到阿里有道笔试题,涉及到catalan数(貌似是13年的),然后总结一下catalan数。

  1. catalan数描述:设c(1)=1,catalan数满足递归式c(n)=c(1)c(n-1)+c(2)c(n-2)...c(n-1)c(1).通用公式为c(n)=C(n,2n)/(n+1)

  2. 其实问题可以转述为:假设有n个数顺序入栈,则可能出栈的方式有多少种?比如有3个数1 2 3,出栈的方式为1 2 3、2 1 3、1 3 2、3 2 1、2 3 1共有5种。思考:入栈的操作有n步,出栈的操作也有n步,如果我们用1表示入栈,0表示出栈,这相当于对2n个数进行全排列,其限制条件为:从左到有扫描这2n个数,1的累积次数必须不得少于0的次数。

  3. 证明如下:首先不考虑限制条件,就相当于对2n个数进行全排列,根据排列组合知识,很容易得到总共的排列方法有C(2n,n)的方式,接下来剔除符合限制条件的方式即可。我们可以这样考虑,假设在第2m+1位置上(含),0的个数为m+1,1的个数为m,这从2m+2到2n的位置中总共有n-m-1个0,n-m个1,如果我们2m+2到2n的位置上所有的0,1进行反转,即0->1,1->0,则其后0的个数变为n-m,1的个数变为n-m-1,那么这个2n数中1的个数总共为n-1,0的个数为n+1。也就是说,对于总共2n个数,如果有n+1个0,n-1个1,则在某个奇数位置必存在0的累积个数大于1的累积个数。即n+1个0和n-1个1必对应一个不符合要求的数。 用上述方法建立由n-1个1和n+1个0组成的2n个数,与由n个1和n个0组成的2n个数进行一一对应。例如:10100101由4个1和4个0组成的8位二进制数,但在第5个位置0的累积个数为3,1的累积个数为0,则对应3个1和2个0组成的10100010,因此不符合要求的2n个数与n-1个1和n+1个0组成的2n个数一一对应,故结果为C(2n,n)-c(2n,n+1)

  4. catalan数的应用挺广泛的,主要应用于以下几类问题:

    (1)括号化问题
    矩阵链乘: P=a1*a2*a3*……*an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案
    (2)出栈次序问题
    有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)
    (3)将多边行划分为三角形问题
    在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?
    (4)单调路径问题
    一个单调路径从格点左下角出发,在格点右上角结束,每一步均为向上或向右,不能越过对角线

不过我们似乎没有用到catalan数的递归,比如如果需要我们输出出栈的顺序,则怎么设计?先mark一下,晚上我再纠结。。。

你可能感兴趣的:(算法学习笔记(7)------catalan数)