n个元素按顺序入栈,求合法的出栈序列的个数

方法一

n = 1时,记出栈序列的个数f(1) = 1;
n = 2时,易知f(2) = f(1) + f(1) = 2; //12, 21
n = 3时,f(3) = f(2) + f(1) * f(1) + f(2); //123, 132, 213, 231, 321

n = k时,记f(0) = 1,则f(k) = f(0) *f(k-1) + … + f(k-1) *f(0)

方法二

若一次入栈操作记为‘1’,一次出栈操作记为‘0’,则每一个出栈序列对应一个由n个’1’和n个‘0’组成的组合数,且对该组合数从左至右进行扫描时,‘1’的个数始终不少于‘0’的个数。
对于一个非法的组合数,从左至右进行扫描时,一定存在m = 0,1,2,…,使得在第2m+1个元素时,有m个‘1’和m+1个‘0’;故后2(n-m)-1个元素一定由n-m个‘1’和n-m-1个‘0’组成,若将后2(n-m)-1个元素的‘1’和‘0’互换,则该组合数由n-1个‘1’和n+1个‘0’组成。相反,若该组合数由n-1个‘1’和n+1个‘0’组成,那么一定存在m = 0,1,2,…,使得第2m+1位之前的‘1’的个数少于‘0’的个数。
综上,n个元素顺序入栈,出栈序列的个数f(n) = C(2n,n) - C(2n, n-1) = C(2n,n)/(n+1)

方法三(卡特兰数)

满足h(0) = 1, h(1) = 1, h(n) = h(0) *h(n-1) + h(1) *h(n-2)… + h(n-1) *h(0)的数成为卡特兰数。
递推式的解为 C(2n, n) / (n + 1)或 C(2n, n) - C(2n, n - 1).

相似问题

1.买票找零
2n个人排队买票,其中n个人只有5元纸币,另n个人只有10元货币,票价5元。求有多少种方法使得每个10元顾客都能被找零。

2.n个1和n个-1组成一个数字串,求任意前k个数的和均不少于零的字串的个数。

结果:C(2n, n) / (n+1)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值