今天看到阿里有道笔试题,涉及到catalan数(貌似是13年的),而后总结一下catalan数。 设计
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)
递归
其实问题能够转述为:假设有n个数顺序入栈,则可能出栈的方式有多少种?好比有3个数1 2 3,出栈的方式为1 2 三、2 1 三、1 3 二、3 2 一、2 3 1共有5种。思考:入栈的操做有n步,出栈的操做也有n步,若是咱们用1表示入栈,0表示出栈,这至关于对2n个数进行全排列,其限制条件为:从左到有扫描这2n个数,1的累积次数必须不得少于0的次数。 二进制
证实以下:首先不考虑限制条件,就至关于对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) 方法
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一下,晚上我再纠结。。。 思考