火车进出栈问题 题解

来源 卡特兰数

个人评价(一句话描述对这个题的情感)

…~%?..,# *'☆&℃$︿★?

1 题面

一列火车n节车厢,依次编号为1,2,3,…,n。每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种。

输入

一个数,n(n<=60000)

输出

一个数s表示n节车厢出栈的可能排列方式

样例

样例输入1
3
样例输出1
5

2 分析题面

求卡特兰数的第n项,不取模

有两种方式,都能推出这是一道纯卡特兰数

2.1 递推

计数原理中的乘法原理,总的方案数等于第一步的方案数和第二步的方案数之积

以编号为 k k k 的车厢为界,将列车分为两部分

一部分是在第 k k k 节车厢出栈前出栈的车厢,一部分是在第 k k k 节车厢出栈后出栈的车厢

设在第 k k k节车厢出栈前出栈的车厢的数量为 i ( 0 < = i < = k ) i(0<=i<=k) i(0<=i<=k)

则在第 k k k 节车厢出栈后出栈的车厢的数量为 ( k − i − 1 ) (k-i-1) (ki1)

i i i 节车厢出栈的可能性数量有 F ( i ) F(i) F(i)

( n − i − 1 ) (n-i-1) (ni1) 节车厢出栈的可能性数量有 F ( k − i − 1 ) F(k-i-1) F(ki1)

所以总的数量为 F ( i ) × F ( k − i − 1 ) F(i)\times F(k-i-1) F(i)×F(ki1)

由于当只有0节车厢(即一节车厢也没有)时,方案数为 1 1 1

所以, F ( 0 ) = 1 F(0)=1 F(0)=1

因此,我们可以得到一个递归公式:

F ( k ) = F ( 0 ) × F ( k − 1 ) + F ( 1 ) × F ( k − 2 ) + F ( 2 ) × F ( k − 3 ) + . . . + F ( k − 2 ) × F ( 1 ) + F ( k − 1 ) × F ( 0 ) F(k)=F(0)\times F(k-1)+F(1)\times F(k-2)+F(2)\times F(k-3)+...+F(k-2)\times F(1)+F(k-1)\times F(0) F(k)=F(0)×F(k1)+F(1)×F(k2)+F(2)×F(k3)+...+F(k2)×F(1)+F(k1)×F(0)

其中 k > = 1 , F ( 0 ) = 1 其中k>=1,F(0)=1 其中k>=1F(0)=1

看出什么了吗?

其实这道题就是Catalan number!!

只不过n的初值少 1 1 1。。。

2.2 组合数

首先,每一种进出栈的顺序都与出栈序列一一对应

也就是说,如果我们用 + 1 +1 +1表示进栈, − 1 -1 1表示出栈

那么举个例子:

出栈序列 1 , 3 , 4 , 2 1,3,4,2 1,3,4,2 与进出栈顺序 + 1 , + 1 , − 1 , + 1 , + 1 , − 1 , − 1 , − 1 +1,+1,-1,+1,+1,-1,-1,-1 +1,+1,1,+1,+1,1,1,1 是对应的

那么对 n n n个数的序列,总的进出栈顺序不是就是给 2 n 2n 2n 1 1 1前面挑 n n n个添加 + + +

其他的添加 − - 号,共 C 2 n n {\rm C}_{2n}^n C

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值