楼梯问题

问题 B: 楼梯问题

时间限制: 1 Sec  内存限制: 128 MB

题目描述

魔法学院建造的太空梯类似一个用数目为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);
}
 

猜你喜欢

转载自www.cnblogs.com/lee454207074/p/11795134.html