1017. Staircases
Time limit: 1.0 second
Memory limit: 64 MB
Memory limit: 64 MB
One curious child has a set of
N little bricks (5 ≤
N ≤ 500). From these bricks he builds different staircases. Staircase consists of steps of different sizes in a strictly descending order. It is not allowed for staircase to have steps equal sizes. Every staircase consists of at least two steps and each step contains at least one brick. Picture gives examples of staircase for
N=11 and
N=5:
Your task is to write a program that reads the number
N and writes the only number
Q — amount of different staircases that can be built from exactly
N bricks.
Input
Number
N
Output
Number
Q
Sample
input | output |
---|---|
212 |
995645335 |
Problem Source: Ural State University Internal Contest '99 #2
Difficulty: 158
Printable version
Submit solution
Discussion (56)
All submissions (22620) All accepted submissions (11273) Solutions rating (8173)
n个块搭台阶,要求楼梯的高度是严格递增的;
求能够搭的种类数。
dp[i][j] : 表示i块最后一列是j的种类数;
状态转移方程:dp[i][j] = sum(dp[i - j][k]) (0<=k<j);
代码:
/* n个块搭台阶,要求楼梯的高度是严格递增的; 求能够搭的种类数。 dp[i][j] : 表示i块最后一列是j的种类数; dp[i][j] = sum(dp[i - j][k]) (0<=k<j); */ #include<bits/stdc++.h> #define ll long long using namespace std; const int maxn = 5e2+7; int n; ll dp[maxn][maxn]; void init() { dp[0][0] = 1; for(int i = 1; i < maxn; i++) { for(int j = 1; j <= i; j++) { for(int k = 0; k < j; k++) { dp[i][j] += dp[i - j][k]; } } } } int main() { init(); //freopen("in.txt", "r", stdin); while(~scanf("%d", &n)) { ll sum = 0; for(int i = 1; i < n; i++) sum += dp[n][i]; printf("%lld\n", sum); } return 0; }