问题 B: 楼梯问题
时间限制: 1 Sec 内存限制: 128 MB题目描述
魔法学院建造的太空梯类似一个用数目为n的砖块堆起来的楼梯。楼梯的每层严格由不同个数的砖块按照由小到大的次序排列。在排列中,不允许各层有相同的高度。每个楼梯至少有两层,每层至少有一块。
图给出N=11和N=5的时的摆法:

你的任务是写一个程序,输入砖块数N,打印出共有多少种不同的摆法。
图给出N=11和N=5的时的摆法:

你的任务是写一个程序,输入砖块数N,打印出共有多少种不同的摆法。
输入
砖块数N,3≤N≤500。
输出
一个整数,表示共有多少种不同的摆法。
样例输入 Copy
5
样例输出 Copy
2 说是DP也不是特别准确,感觉像是递推,练练思维挺好。 设dp[i][j]表示用了i块砖头,最后一列砖头高度为j时的最大方案数,因为列数从前往后,每一列的高度是递增的,所以可以从dp[i-j][k]推得。(最后一列用了j个堆了j的高度,则前面就有i-j个块) 1<=k<j,k有可能会大于i-j不过没关系,这些值为零,不影响结果。上代码。
#include<bits/stdc++.h>
#define maxn 505
using namespace std;
long long dp[maxn][maxn];
long long n,ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
dp[i][i]=1;
for(int j=2;j<i;j++){
for(int k=1;k<j;k++){//如果不放心,这里的边界可以取成k<=min(i-j,j-1)
dp[i][j]+=dp[i-j][k];
}
}
}
for(register int i=1;i<n;i++) ans+=dp[n][i];//累加答案
printf("%lld",ans);
}