Catalan数:
f[n] = f[1]*f[n-1]+f[2]*f[n-2]+.............+f[n-1]*f[1];
递推公式f(n)=((4*n-2)/(n+1))*f(n-1);
应用:Catalan习题
1.括号化问题
.Dyck word是一个有n个X和n个Y组成的字串,且所有的部分字串皆满足X的个数大于等于Y的个数。以下为长度为6的dyck words:
假设n为3:XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY
我们把x看成做括号,y看成右括号。
那个元素,我们按最后一个元素出栈分类计算:
若最后出栈的是第一位,则它等剩余n-1个操作完后出来,a[n-1]
若最后出栈的第二位,则它先等第一位出来,然后等剩下n-2个处理完后出来,a[n-2]
若最后出栈的第三位,则它要先等前两位出来,a[2],然后等剩余n-3个处理完后出来,a[2]*a[n-3]
于是满足Catalan数。栈的出栈次序,n对括号的匹配次序等等
2.矩阵连乘的方法数问题:
对于M1(M2(M3M4))和(M1(M2M3))M4会得到相同的结果
但是前一种需要125000次,后一种2200次乘法。所以我们要注意矩阵相乘的次序
我们可以借鉴括号化问题来思考,通过考虑最后一次乘法的位置来判断,推理同上。
3.n节点二叉树的构造方法数(左子树值 < 根节点值 < 右子树的值)
对于根肯定会占用一个节点,则根节点的左右子树节点数量会有0:n-1 1:n-2 ...... n-1:0
假设T[n]表示n个节点的方法数:T[n] = T[0]*T[n-1] + ....... T[n-1]*T[0]
4.n凸边形划分为三角形的方法数
以凸边形的一边AB为基础,我们可以分别讨论第三点所在的位置来,连接三点后,三角形左右是两个凸边形。
然后求解两个凸边形即可。
所以F[n] = F[2]*F[n] + F[3]*F[n-1]+......+F[n]*F[2];
F[0]*F[n-2]表示左边凸边形节点为0,右边凸边形的节点数为n-2
5.将圆上的2n个点连接起来,求这n条线段不相交的方法数
类似于三角形的问题,选择一个点为基,则这条直线左右的点数可能:0:n-2 1:n-3 ... n-2:1
所以我们F[n] = F[0]*F[n-2] + F[1]*F[n-3] + ....... F[n-2]*F[0];
6. 2n个人排成一行进入剧场,入场费5元。其中n个人有一张5元,另外n个人只有10元。请问有多少种方法使只要
有10元买票,售票处就一定能找出5元
类似于上面括号化问题,进行 进出栈即可。
证明:
令1表示进栈,0表示出栈,则可转化为求一个2n位、含n个1、n个0的二进制数,满足从左往右扫描到任意一位时,经过的0数不多于1数。显然含n个1、n个0的2n位二进制数共有个,下面考虑不满足要求的数目.
考虑一个含n个1、n个0的2n位二进制数,扫描到第2m+1位上时有m+1个0和m个1(容易证明一定存在这样的情况),则后面的0-1排列中必有n-m个1和n-m-1个0。将2m+2及其以后的部分0变成1、1变成0,则对应一个n+1个0和n-1个1的二进制数。反之亦然(相似的思路证明两者一一对应)。
/*在前面出现错误的部分,它的子串(不包括自己)一定是正确的,把前面这段看成key的话,对于每个相同key,
后面转变后肯定是不同的,所以一一对应。