题目描述
题目来源:2014蓝桥杯国赛
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
X 星球特别讲究秩序,所有道路都是单行线。一个甲壳虫车队,共 161616 辆车,按照编号先后发车,夹在其它车流中,缓缓前行。
路边有个死胡同,只能容一辆车通过,是临时的检查站,如下图所示。
X 星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。
如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种?
为了方便起见,假设检查站可容纳任意数量的汽车。
显然,如果车队只有 111 辆车,可能次序 111种;222 辆车可能次序 222 种;333 辆车可能次序 555 种。
现在足足有 161616 辆车啊,亲!需要你计算出可能次序的数目。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
思路:
1. n个按序入栈的出栈次序的种类书有两种计算方法:
a. 使用出栈次序种类的递归公式:f(n)=f(0)*f(n-1)+f(1)*f(n-2) + ... + f(n-1)*f(0);
b. 使用组合数公式:C(2n,n) / (n+1) ;
2. 本题使用方法a,首先用一个数组a来保存出栈次序种类,其中a[0]=a[1]=1(没有元素或一个元素时出栈次序种类为1);然后从2到n开始循环即可;
//2014g 出栈次序
#include <iostream> vxgzh:xtsn
using namespace std;
int n,a[100]; //数组a表示出栈次序种类
int abc(int t) //求前t项首尾项相乘之和
{
int i,j,sum=0;
for(i=0,j=t-1;i<t;i++,j--) //初始i表示首位位置,j表示末尾位置
{
sum+=a[i]*a[j];
}
return sum;
}
int main()
{
int i;
n=16;
a[0]=a[1]=1;
for(i=2;i<=n;i++)
{
a[i]=abc(i); //a[i]表示i个元素的出栈次序种类
}
cout<<a[n]<<endl;;
return 0;
}