出栈序列问题,求卡特兰数

题目

有一个操作序列为1到n,现在他想把这些数依次扔到栈里再拿出来,他想知道有多少种不同的输出序列。

递推解法

耐心思考,该问题有子问题,即递推公式。

我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3我们很容易得出:

f(1) = 1 // 即 1
f(2) = 2 // 即 12、21
f(3) = 5 // 即 123、132、213、321、231

再多了怎么办?耐心思考一下我们是怎么得到的这些结果。

考虑f(4), 我们给4个元素编号为a,b,c,d,分别可能在1,2,3,4四个位置。遵循出栈规则,后一个出栈者一定比前一个出栈者大,或者只比前一个出栈者小一位,注意这个顺位随着元素的出栈而变化。

分析如下:

  1. 如果元素a在1号位置。那么一定是a进栈,马上出栈;此时还剩元素b、c、d,转化为子问题f(3)。
  2. 如果元素a在2号位置。那么一定有1个元素比a先出栈,即有f(1)种可能顺序,根据出栈规则,只能是b;还剩c、d,即f(2),根据乘法原理,一共为f(1) * f(2)。
  3. 如果元素a在3号位置,那么一定有2个元素比a先出栈,即有f(2)种可能顺序,根据出栈规则,只能是b、c;还剩d,即f(1),根据乘法原理,一共为f(2) * f(1)。
  4. 如果元素a在4号位置,那么一定是a先进栈,最后出栈,此时还剩元素b、c、d,转化为子问题f(3)。
f(4) = f(3) + f(2)*f(1) + f(1)*f(2) + f(3)

f(0) = 1,则:

f(4) = f(0)*f(3) + f(1)*f(2) + f(2)*f(1) + f(3)*f(0)

得递推公式:

f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... + f(n-1)*f(0)

化通项公式:卡特兰数(Catalan Number)

C(2n,n) - C(2n,n-1) == C(2n,n)/(n+1)

折线法

转载于:https://my.oschina.net/tridays/blog/782021

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值