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

这是一个排列组合的问题,赫赫有名的卡特兰数

举例说明,共有一个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 ==  N return  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)

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值