[vijos1037]搭建双塔
2017-10-23 21:21
239 查看
题目←
限制和答案,到底哪一个应该是数组下标
设f[i][j]为取到第i个水晶,高度差为j时的较高塔的最高高度
那答案的更新,分方和不放讨论
一、不放,dp[i][j] = dp[i - 1][j];
二、放
放的话,对答案影响有三种情况:
1、放在较高塔上,dp[i][j] = dp[i][j - h[i]] + h[i];//高度差增加h[i],高塔高度增加h[i]
2、放在较矮塔上而高度超过原高塔,dp[i][j] = dp[i - 1][h[i] - j] + j;//新增高度差即为高塔增加高度;
3、放在较矮塔上而高度不超过原高塔,dp[i][j] = dp[i - 1][j - h[i]];//高度差比原来减小h[i],高塔高度不变
注意三种情况都要在dp[i - 1]中对应情况合法时进行。
代码有些乱
因为一开始没考虑到情况2、3,而样例又比较良心没情况3过不了,所以1是要状态,2、3是给状态
限制和答案,到底哪一个应该是数组下标
设f[i][j]为取到第i个水晶,高度差为j时的较高塔的最高高度
那答案的更新,分方和不放讨论
一、不放,dp[i][j] = dp[i - 1][j];
二、放
放的话,对答案影响有三种情况:
1、放在较高塔上,dp[i][j] = dp[i][j - h[i]] + h[i];//高度差增加h[i],高塔高度增加h[i]
2、放在较矮塔上而高度超过原高塔,dp[i][j] = dp[i - 1][h[i] - j] + j;//新增高度差即为高塔增加高度;
3、放在较矮塔上而高度不超过原高塔,dp[i][j] = dp[i - 1][j - h[i]];//高度差比原来减小h[i],高塔高度不变
注意三种情况都要在dp[i - 1]中对应情况合法时进行。
代码有些乱
因为一开始没考虑到情况2、3,而样例又比较良心没情况3过不了,所以1是要状态,2、3是给状态
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN = 200 + 50; int dp[MAXN][2050]; int h[MAXN],n; int main(){ memset(dp,-1,sizeof(dp)); dp[0][0] = 0; scanf("%d",&n); for(int i = 1;i <= n;i ++){ scanf("%d",&h[i]); } int sum = 0; for(int i = 1;i <= n;i ++){ sum += h[i]; for(int j = 0;j <= sum;j ++){ dp[i][j] = max(dp[i][j],dp[i - 1][j]); if(h[i] - j >= 0) if(dp[i - 1][h[i] - j] != -1){ dp[i][j] = max(dp[i][j],dp[i - 1][h[i] - j] + j); } if(dp[i][j] != -1){ dp[i + 1][j + h[i + 1]] = max(dp[i + 1][j + h[i + 1]],dp[i][j] + h[i + 1]); if(j >= h[i + 1]){ dp[i + 1][j - h[i + 1]] = max(dp[i + 1][j - h[i + 1]], dp[i][j]); } } } } if(dp [0] > 0)printf("%d",dp [0]); else printf("Impossible"); return 0; }
相关文章推荐
- 搭建双塔(vijos 1037)
- 【DP】【vijos1037】搭建双塔
- Cpp环境【Vijos1037】【CQYZos1391】搭建双塔
- dp遍历所有状态 vijos 1037 搭建双塔 1059 积木城堡 1153 猫狗大战
- shu_1299 vijos 1037(搭建双塔)
- [Vijos1037]搭建双塔
- Vijos - 1037 搭建双塔 动态规划(DP) 重庆一中高2018级竞赛班第七次测试 2016.8.4 Problem 2
- vijos1037 搭建双塔(重庆一中高2018级信息学竞赛测验7) 解题报告
- vijos1037 搭建双塔-状态优化dp
- vijos1037-搭建双塔
- vijos 1037 搭建双塔 简单DP
- vijos1037 双塔问题
- vijosP1037搭建双塔
- vijosP1037搭建双塔
- vijos搭建双塔(dp)
- |Vijos|动态规划|P1037 搭建双塔
- [vijos P1037]搭建双塔
- Vijos P1037 搭建双塔(动态规划,二维背包)
- Vijos P1037 搭建双塔(动态规划)
- vijos P1037搭建双塔