来源 卡特兰数
个人评价(一句话描述对这个题的情感)
…~%?..,# *'☆&℃$︿★?
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) (k−i−1)
前 i i i 节车厢出栈的可能性数量有 F ( i ) F(i) F(i)
后 ( n − i − 1 ) (n-i-1) (n−i−1) 节车厢出栈的可能性数量有 F ( k − i − 1 ) F(k-i-1) F(k−i−1)
所以总的数量为 F ( i ) × F ( k − i − 1 ) F(i)\times F(k-i-1) F(i)×F(k−i−1)
由于当只有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(k−1)+F(1)×F(k−2)+F(2)×F(k−3)+...+F(k−2)×F(1)+F(k−1)×F(0)
其中 k > = 1 , F ( 0 ) = 1 其中k>=1,F(0)=1 其中k>=1,F(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