您的位置:首页 > 其它

UVA - 10891 Game of Sum 区间DP(博弈DP)循环写法

2017-08-14 16:36 351 查看
跟上一篇博文一样,都是这个题,上一篇用递归的方式写的,这一篇用循环的方式求dp [ i ] [ j ] ——- i - j 区间的某个人最大的取值

详解见上篇,理解区间与从左从右开始的子区间之间的关系就会这个题了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<math.h>
#include<set>
#include<stack>
#include<queue>
#include<ctype.h>
#include<vector>
#include<algorithm>
#define PI acos(-1.0)
// cout << "  ===  " << endl;

using namespace std;
typedef long long ll;
const int maxn = 100 + 7, INF = 0x3f3f3f3f, mod = 1e9+7;
int n;
int a[maxn], sum[maxn], dp[maxn][maxn], vis[maxn][maxn];

void init() {
memset(sum, 0, sizeof sum);
memset(dp, 0, sizeof dp);
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
sum[i] = sum[i-1] + a[i];
dp[i][i] = a[i];
}
}

int main() {
while(scanf("%d", &n) != EOF && n) {
init();
for(int len = 1; len < n; ++len) {
for(int i = 1; i+len <= n; ++i) {
int j = i + len;
int min_ = 0;
for(int k = i+1; k <= j; ++k) {
min_ = min(min_, dp[i][k-1]);
min_ = min(min_, dp[k][j]);
}
dp[i][j] = (sum[j] - sum[i-1] - min_);
}
}
printf("%d\n", dp[1]
* 2 - sum
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: