问题描述:
X 星球特别讲究秩序,所有道路都是单行线。 一个甲壳虫车队,共 16 辆车,按照编号先后发车,夹在其它车流中,缓缓前行。 路边有个死胡同,只能容一辆车通过,是临时的检查站,如图所示。 X 星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可 能仔细检查。 如果车辆进入检查站和离开的次序可以任意交错。 那么,该车队再次上路后,可能的次序有多少种? 为了方便起见,假设检查站可容纳任意数量的汽车。 显然,如果车队只有 1 辆车,可能次序 1 种;2 辆车可能次序 2 种;3 辆车可能 次序 5 种。 现在足足有 16 辆车啊,亲!需要你计算出可能次序的数目.
虽然问题描述的很花里胡哨,但实际上就是让你求一个出栈次序数目问题。
很显然,这个是有规律可循的。
我们不妨设一个数列 a1,a2,a3 ```` 。作为入栈的顺序。我们很容易能够想到,作为入栈第一位的a1,在出栈的位置是任意的。
(这一点我是通过列举前四辆车的出栈次序得出)。
那么不妨假设若a1在出栈的首位,则此时a1一定是先进先出,后续的a2等并未进入到栈里。那么这个出栈次序的问题就变成了1*f(n-1)。
当a1是第i位出栈时,前面一定有i-1位元素比a1先出栈,后面一定有总数的n-i位比a1后出栈。那么根据我们的乘法原理,可以得到此时的次序位f(i-1)*f(n-i).
因为a1是可能出现在出栈数列的每一处的,所以总出栈次序就是将a1在每一处的次序总数相加。
即f(n)=f(0)*f(n-1) + ````` f(i-1)*f(n-i)````。
具体代码如下:
#include <iostream>
using namespace std;
int main()
{
long long f(int n);
long long n;
n=f(16 );
cout << n << endl;
return 0;
}
long long f(int n)
{
long long res=0;
if(n==0)
return 1;
if(n==1)
return 1;
if(n==2)
return 2;
for(int i=1;i<=n;i++)
res=res+f(i-1)*f(n-i);
return res;
}
答案:35357670