Description
一个小孩有N块小砖头 (5 <= N <= 500).这些小砖头能彻成不同的楼梯。这些楼梯包含着不同高度的梯级(严格按照递减顺序),不允许有(高度)相同的梯级。每一个楼梯至少包含2个梯级,每个梯级至少一块砖。 以下为N=11,N=5的例子
![](http://acm.fjnu.edu.cn/images/1904.jpg)
Your task is to write a program that reads from input file one number N and writes to output file the only number Q ?amount of different staircases that can be built from exactly N bricks.
读入N后,求出Q,即用N块砖能彻出的不同的楼梯数量。
Input
输入第一行是测试数据的组数M,
接着M行每行有一个Number N,表示有N块小砖头
Output
输出M行,每行有一个Number Q,表示用N块砖能彻出的不同的楼梯数量。
Sample Input
1 212
Sample Output
995645335
KEY:DP,其中a[i][j]表示一共有i块,第一块为j,进行DP
- Source:
- #include<iostream>
- using namespace std;
- long long a[501][501];
- int N;
- void GetList()
- {
- int n,k,i;
- for(i=1;i<=500;i++)
- a[i][i]=1;
- for(n=2;n<=500;n++)
- for(k=1;k<=n-1;k++)
- {
- for(i=k+1;i<=n;i++)
- {
- if(n-k<=k) break;
- else
- {
- a[n][k]+=a[n-k][i];
- }
- }
- }
- }
- int main()
- {
- long long sum=0;
- int i,j;
- GetList();
- int n;
- cin>>n;
- for(i=1;i<=n;i++)
- {
- cin>>N;
- sum=0;
- for(j=1;j<N;j++)
- sum+=a[N][j];
- printf("%lld/n",sum);
- }
- return 0;
- }