您的位置:首页 > 产品设计 > UI/UE

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]]));

:

[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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: