您的位置:首页 > 其它

UVa 10891 - Game of Sum

2013-07-01 18:27 351 查看
/*
DP: d[i][j] = max { max{sum{i,k} - d[k+1][j]}, max{sum{k,j-1} - d[i][k]} }
d[i][j]表示在区间[i, j)之间先拿者可以赢多少。
ps: 数据不强,没用long long也过了
*/
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 105;
int A[MAXN];
int n;
int d[MAXN][MAXN];

int dp()
{
for(int l=1; l<=n; l++) {
for(int i=0; i<=n-l; i++) {
int j = i+l;
int s = 0;
int m = -(1<<30);
for(int k=i; k<j; k++) {
s += A[k];
if(s - d[k+1][j] > m) m = s - d[k+1][j];
}
s = 0;
for(int k=j-1; k>i; k--) {
s += A[k];
if(s - d[i][k] > m) m = s - d[i][k];
}
d[i][j] = m;
}
}
return d[0]
;
}

int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
while(scanf("%d", &n) == 1 && n) {
for(int i=0; i<n; i++) {
scanf("%d", &A[i]);
}
printf("%d\n", dp());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: