标签:
Description
Input
Output
Sample Input
input | output |
---|---|
212 |
995645335 |
大意:n块砖头,让你排成一个楼梯,满足列数大于2,并且后面列的高度大于前面列的高度所有可能的情况种类
初始化:dp[i][i] = 1 表示一共有i块砖头,在当前(也就是最后一列)把所有的砖块都放上只有一种
状态转移方程 dp[i][j] += dp[i-j][0..j-1] 一共i个砖块最后一列为j个 状态是由前面一个状态转移过来的 即少了最后一列砖块现在变成i-j块的所有的情况,这个k必须小于j,最后答案就是dp[n][0..n-1] 除了一共有n块,最后一列全是n的情况,开long long orz
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long dp[550][550]; int main() { int n; while(~scanf("%d",&n)){ memset(dp,0,sizeof(dp)); for(int i = 1; i <= n ;i++) dp[i][i] = 1; //用了i块砖头,当前有i块砖头 for(int i = 1; i <= n ;i++){ for(int j = 1; j < i ;j++){ for(int k = 0; k < j ;k++){ dp[i][j] += dp[i-j][k]; } } } long long ans = 0; for(int i = 0 ; i < n;i++) ans += 1ll*dp[n][i]; printf("%lld\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/zero-begin/p/4488947.html