Light OJ 1126 Building Twin Towers (DP)
2016-02-12 12:48
483 查看
题意:给出n个砖块,砌出两个相同高度的塔,问塔的最大高度为多少。
解析:设dp[i][j]为考虑前i个砖块,高度差为j的最高时两塔较小的高度。
状态转移:dp[i][j] = max(dp[i-1][j],dp[i-1][j+a[i]]+a[i],(a[i]>=j?dp[i-1][a[i]-j]+a[i]-j:dp[i-1][j-a[i]]));
解析:设dp[i][j]为考虑前i个砖块,高度差为j的最高时两塔较小的高度。
状态转移:dp[i][j] = max(dp[i-1][j],dp[i-1][j+a[i]]+a[i],(a[i]>=j?dp[i-1][a[i]-j]+a[i]-j:dp[i-1][j-a[i]]));
: [code]#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> using namespace std; typedef long long LL; const int inf = 0x3f3f3f3f; int n,a[55],dp[2][500005]; int main(){ int i,j,cas,T; scanf("%d",&cas); for(T = 1;T <= cas;T++){ scanf("%d",&n); int sum = 0; for(i = 1;i <= n;i++){ scanf("%d",&a[i]); sum += a[i]; } for(i = 0;i < 2;i++)for(j = 0;j <= sum;j++) dp[i][j] = -inf; dp[0][0] = 0; for(i = 1;i <= n;i++){ int o = i&1,p = (i+1)&1; for(j = 0;j <= sum;j++){ dp[o][j] = dp[p][j]; if(a[i]>=j) dp[o][j] = max(dp[o][j],dp[p][a[i]-j]+a[i]-j); else dp[o][j] = max(dp[o][j],dp[p][j-a[i]]); if(j+a[i]<=sum) dp[o][j] = max(dp[o][j],dp[p][j+a[i]]+a[i]); //printf("%d %d %d\n",i,j,dp[i][j]); } } printf("Case %d: ",T); if(dp[n&1][0]<=0) puts("impossible"); else printf("%d\n",dp[n&1][0]); } return 0; }
相关文章推荐
- Building Maintainable Software-java篇之Write Short Units of Code
- deque 双端队列。
- PHP:数组操作函数array_count_values()的实现
- ELK setup guide
- Java中序列化的serialVersionUID作用
- 【CodeForces 618B】Guess the Permutation
- HDU 3732 Ahui Writes Word(01背包转化为多重背包)
- E - Number Sequence(第二季水)
- css3 Media Query IE6-8兼容问题
- UITableView细节.txt
- async 异步进度条,防UI卡顿
- 225. Implement Stack using Queues LeetCode
- 【leetcode】Array——Unique Paths II(63)
- 【leetcode】Array——Unique Paths(62)
- iOS之加速计、陀螺仪(UIAccelermeter、Core Motion)
- iOS之蓝牙(Bluetooth)
- Android开发学习之路--UI之简单聊天界面
- Android开发学习之路--UI之简单聊天界面
- UIView的setNeedsDisplay和setNeedsLayout方法
- 232. Implement Queue using Stacks LeetCode