问题 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); }