Catalan数

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]

hdu 1130


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元

类似于上面括号化问题,进行 进出栈即可。


7.在不越过主对角线的前提下从左下角运动到右上角的方案数。



不越过主对角线,即步数上x >= y,如此便可以转化成1中求Dyck word   (好机智)

证明:

令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,

后面转变后肯定是不同的,所以一一对应。

/*个人学习


原文地址:https://www.cnblogs.com/Przz/p/5409662.html