关于N个数1--N数顺序入栈,有多少种出栈方式的问题

来源:互联网 发布:酷音铃声mac版本 编辑:程序博客网 时间:2024/04/30 15:53
这是一个排列组合的问题,赫赫有名的卡特兰数

举例说明,共有一个1,2,3,4四个数,入栈方式有
1入,2入,3入,4入,4出,3出,2出,1出 故出栈顺序4,3,2,1
1入,1出,2入,3入,4入,4出,3出,2出 故出栈顺序1,4,3,2
1入,1出,2入,2出,3入,4入,4出,3出 故出栈顺序1,2,4,3
1入,1出,2入,2出,3入,3出,4入,4出 故出栈顺序1,2,3,4
1入,2入,2出,3入,4入,4出,3出,1出 故出栈顺序2,4,3,1
... ...

实际上解决此问题可以这样做:假设n个元素的出栈有 H(n)种方式,对于n>=2

假设索引为i个元素第一个出栈,那么后面的出栈方式分为两块,一个是 1-- i-1的出栈方式,其有H(i-1),另外是i+1至n的出栈方式,共有H(n-i):
故其对于元素索引为i的元素第一个出栈共有H(i-1)*H(N-i)种出栈方式
那么
H(N) = H(1-1)*H(N-1)+(2-1)*(N-2)+....+H(N-1)*H(1-1)取H(0)=1,H(1)=1,这是一个标准的求取卡特兰数问题

C语言代码实现为一下:递归实现
int catlin(int N)
{
                 if (0 == N || 1 == Nreturn 1;
                 int sum = 0;
                 for (int i = 0; i < N; i++)
                                sum += catlin(i)*catlin( N - i - 1);
                 return sum;
}

对应的排列组合为C(2n,n) - C(2n,n+1)

0 0