您的位置:首页 > 其它

UVA 10891 Game of Sum

2014-09-09 17:13 281 查看
这个题就是 动规, 由于题目描述 左边拿 右边拿、 所以数组很容易构造, d【i】【j】 来表示 从第 i 个数 到 第 j 个数, 最大的数值。

这样 状态转移方程就好写了、 d(i,j) = sum【i】【j】 - min(d(i+1,j),d(i+2,j)......);

顺便用记忆话搜索。

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
#define ll long long
typedef unsigned long long ull;
#define MAXN 100 + 10
int d[MAXN][MAXN];
int vis[MAXN][MAXN];
int s[MAXN] = {0};
int dp(int a, int b){
    if(vis[a][b])
        return d[a][b];
    vis[a][b] = 1;
    int m = 0;
    for(int k = a+1; k <= b; k++)
        m = min(m, dp(k, b));
    for(int k = a; k < b; k++)
        m = min(m, dp(a, k));
    d[a][b] = s[b] - s[a-1] - m;
    return d[a][b];
}
int main (){
    int n;
    while(scanf("%d",&n) != EOF && n){
        int a;
        memset(vis,0,sizeof(vis));
        s[0] = 0;
        for(int i = 1; i <= n; i++){
            scanf("%d",&a);
            s[i] = s[i-1] + a;
        }
        int x = dp(1,n);
        printf("%d\n",2*x - s
);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: