卡特兰数的引入与n边形分成三角形的个数有关:
我们令f[n]表示n边形可以分成的三角形的个数,特殊的,令f[2]=1
- 我们考虑以顶点1顶点的一个三角形,假设用的是n边形的k-k+1边,那么这种情况的方案数就是f[k]∗f[n−k+1]f[k]*f[n-k+1]f[k]∗f[n−k+1],这个边可以变化,从1-2到n-1-n,所以f[n]=f[2]∗f[n−1]+f[3]∗f[n−2]+...+f[n−1]∗f[2]f[n]=f[2] *f[n-1]+f[3] *f[n-2]+...+f[n-1]*f[2]f[n]=f[2]∗f[n−1]+f[3]∗f[n−2]+...+f[n−1]∗f[2]
- 我们考虑从某个顶点发出的对角线,将这个n边形分成两部分,考虑这种情况下共有f[3]∗f[n−1]+f[4]∗f[n−1]+...+f[n−1]∗f[3]f[3]*f[n-1]+f[4]*f[n-1]+...+f[n-1]*f[3]f[3]∗f[n−1]+f[4]∗f[n−1]+...+f[n−1]∗f[3]种情况,共有n个顶点,所以还要乘上n,可是这样显然重复的很多的情况。考虑每种情况,共有n-3条对角线,每个对角线的两个顶点都会计算一次这样的情况,所以最后还要除以2*(n-3)
这样我们就得到了两个递推式:
1.f[n]=f[2]∗f[n−1]+f[3]∗f[n−2]+...+f[n−1]∗f[2]1.f[n]=f[2]*f[n-1]+f[3]*f[n-2]+...+f[n-1]*f[2]1.f[n]=f[2]∗f[n−1]+f[3]∗f[n−2]+...+f[n−1]∗f[2]
2.f[n]=n∗(f[3]∗f[n−1]+f[4]∗f[n−2]+...+f[n−1]∗f[3])/(2∗n−6)2.f[n]=n*(f[3]*f[n-1]+f[4]*f[n-2]+...+f[n-1]*f[3])/(2*n-6)2.f[n]=n∗(f[3]∗f[n−1]+f[4]∗f[n−2]+...+f[n−1]∗f[3])/(2∗n−6)
我们将一式往前递推一项,再结合二式,就可以得到递推式:
f[n+1]=f[2]∗f[n]+f[3]∗f[n−1]+...+f[n]∗f[2]=2∗f[2]∗f[n]+(2∗n−6)/n∗f[n]=(4∗n−6)∗f[n]f[n+1]=f[2]*f[n]+f[3]*f[n-1]+...+f[n]*f[2]=2*f[2]*f[n]+(2*n-6)/n*f[n]=(4*n-6)*f[n]f[n+1]=f[2]∗f[n]+f[3]∗f[n−1]+...+f[n]∗f[2]=2∗f[2]∗f[n]+(2∗n−6)/n∗f[n]=(4∗n−6)∗f[n]
这样我们就能递推的求解卡特兰数。
将这个数字的应用推广,这类数字的根本是第一个递推式,我们不妨从0开始算起(忽略卡特兰数的几何意义,仅仅当作一个特殊的递推公式)
f[n]=f[0]∗f[n−1]+f[1]∗f[n−2]+...+f[n−1]∗f[0],其中f[0]=1f[n]=f[0]*f[n-1]+f[1]*f[n-2]+...+f[n-1]*f[0],其中f[0]=1f[n]=f[0]∗f[n−1]+f[1]∗f[n−2]+...+f[n−1]∗f[0],其中f[0]=1
即所有满足这种关系的数字都是卡特兰数,在这种定义下我们同样可以求得递推式
- f[n]=(4∗n−2)/(n+1)∗f[n−1]f[n]=(4*n-2)/(n+1)*f[n-1]f[n]=(4∗n−2)/(n+1)∗f[n−1](结合上面的推法应该可以推出来但是我还没有尝试)
- f[n]=C(n,2n)/n+1=C(n,2n)−C(n−1,2n)f[n]=C(n,2n)/n+1=C(n,2n)-C(n-1,2n)f[n]=C(n,2n)/n+1=C(n,2n)−C(n−1,2n)
应用:只要符合上面那种递推式的都是卡特兰数
- 已知一颗二叉树有n个结点,问:该二叉树能组成多少种不同的形态
问题的关键是找到递推式,我们要想办法将问题转换成子问题,对于这个问题,我们就可以思考左子树和右子树(不同的问题有不同的结构,我们要分析问题的模式,找到将问题分解的方法。)我们用f[n]表示n个节点的数可以形成多少子树,不难想到f[n]满足上面的递推式,是卡特兰数 - 有n个A和n个B排成一排,从第1个位置开始到任何位置,B的个数不能超过A的个数,问这样的排列有多少种
分析一下问题:关键是B的个数不能超过A的个数,所以一旦前2*k个位置中A和B相等,对后面就不会产生影响,相当与后面2 *n-2 *k个位置是独立的,可以重新进行思考。