The Staircases
题意:有n块砖头,规定砌成至少2阶的阶梯,并且每一阶的阶梯不能相同,问有多少种砌法。
思路:dp[i][j]表示i块砖头砌成j个阶梯,那么每次删掉最底层的阶梯,阶数要么相等,要么减1(想想为什么)。最后从2开始枚举到n。注意开long long.
#include<cstdio>
#include<cstring>
using namespace std;
long long dp[505][505];
int main(){
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=501;i++){
for(int j=i;j>=1;j--){
dp[i][j]=dp[i-j][j]+dp[i-j][j-1];
}
}
int n;
while(~scanf("%d",&n)&&n){
long long ans=0;
for(int i=2;i<=n;i++)
ans+=dp[n][i];
printf("%lld\n",ans);
}
}