卡特兰数总结

来源:互联网 发布:xampp手动更改php版本 编辑:程序博客网 时间:2024/04/28 16:03

卡特兰数的经典问题是进栈出栈问题,可以进行2n个操作,问最后栈为空的合法的操作方案数。
比如说 n = 2, 可以进行的合法操作方案如下(进为1,出为-1):
1 -1 1 -1、 1 1 -1 -1 总方案为2
我们考虑用总方案数减去不合法的方案数,总方案数就是C(2n,n),
不合法的方案数怎么算呢?
假设我们这时进行了第2k+1个操作,已经有k+1个操作是出栈,此时明显不合法,后面还有(n-k-1)个出栈操作,有(n-k+1)个进栈操作,我们把他们交换一下,最后会得到(n+1)个出栈操作和(n-1)个进栈操作,这是一定不合法的方案,对于每个不合法的方案我们都能构造出这样的(n+1)个出栈操作,同理,对于每(n+1)个出栈操作,我们一定能对应一个不合法的方案,所以总的不合法方案就为C(2n,n+1),所以合法方案就是:
C(2n,n)- C(2n,n+1) = C(2n,n)/(n+1)
这就是卡特兰数通项公式。
我们可以从通项公式推出递推式:
F(n) = F(n-1) * (4n-2)/(n+1)
其实对于这类问题还有另外一个递推公式,
设第k个操作为使栈为空的操作,那么前面一共有(k-1)个元素出栈了,有F(k-1)种方案,剩下的有F(n-k)种方案,由乘法原理,一共有F(k-1)*F(n-k)种方案,我们枚举k再求和即得总方案数
所以

F(n)=i=1nF(i1)F(ni)

这类问题还有经典的如n个相同结点能组成多少棵不同的二叉树?
我们可以固定一个根节点, 给左边分配(i)个结点, 给右边分配(n-i-1)个结点,所以我们有:

F(n)=i=0n1F(i)F(ni1)

一个圆上有2n个点,问两两相连形成的线段不相交的方案数
我们可以把他们分为上下两部分, 设此时相连的是第i号点,左边有(i-1)个,右边有(n-i-1)个点
所以我们有:

F(n)=i=0n1F(i)F(ni1)

原创粉丝点击