问题描述
X 星球特别讲究秩序,所有道路都是单行线。
一个甲壳虫车队,共 16 辆车,按照编号先后发车,夹在其它车流中,缓缓前行。
路边有个死胡同,只能容一辆车通过,是临时的检查站,如图所示。
X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。
如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种?
为了方便起见,假设检查站可容纳任意数量的汽车。
显然,如果车队只有1辆车,可能次序 1 种;2 辆车可能次序 2 种;3 辆车可能次序 5 种。
现在足足有 16 辆车啊,亲!需要你计算出可能次序的数目。
答案提交
这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性文字)。
答案:35357670
题解
卡特兰数:
看到这样的死胡同,很容易想到一种数据结构——栈
,那么进站相当于push
,出站相当于pop
样例解释 (以 3 为例)
:
123
:1 入栈,1 弹出;2 入栈,2 弹出;3 入栈,3 弹出。132
:1 入栈,1 弹出;2 入栈,3 入栈;3 弹出,2 弹出。213
:1 入栈,2 入栈;2 弹出,1 弹出;3 入栈,3 弹出。231
:1 入栈,2 入栈;2 弹出;3 入栈,3 弹出;1 弹出。321
:1 入栈,2 入栈,3 入栈;3 弹出,2 弹出,1 弹出。
可以发现,当数量为 3
时,入栈和出栈的次数都是 3
,且无论是第几次操作,push
的次数一定大于等于 pop
的次数。
这时候就可以用 卡特兰数
来求解。
卡特兰数=C2nnn+1卡特兰数= \frac{C_{2n}^n}{n + 1}卡特兰数=n+1C2nn
#include <iostream>
using namespace std;
int c[50][50];
int main()
{
for (int i = 0; i <= 16 * 2; i ++)
for (int j = 0; j <= i; j ++)
if(!j) c[i][j] = 1;
else c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
cout << c[16 * 2][16] / (16 + 1) << endl;
return 0;
}