UVA 10891 Game of Sum——dp

版权声明:欢迎大家转载,转载请注明出处 https://blog.csdn.net/hao_zong_yin/article/details/81842349

定义dp[i][j]表示面对区间[i,j]的数执先手一方可获得的最大数字和

注意题目描述貌似不太严谨,差距可以是负的,一开始加绝对值错了。。。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 105;
const ll INF = 1e16;
int n;
ll a[maxn], sum[maxn];
ll dp[maxn][maxn];
inline ll mabs(ll x) { return x > 0 ? x : -x; }
ll solve(int l, int r) {
    if (l > r) return 0;
    if (l == r) return dp[l][r] = a[l];
    if (dp[l][r] != -INF) return dp[l][r];
    ll ans = -INF;
    for (int i = l; i <= r; i++) {
        ll t = sum[r] - sum[i] - solve(i+1, r) + sum[i] - sum[l-1];
        ans = max(ans, t);
    }
    for (int i = r; i >= l; i--) {
        ll t = sum[i-1] - sum[l-1] - solve(l, i-1) + sum[r] - sum[i-1];
        ans = max(ans, t);
    }
    return dp[l][r] = ans;
}
int main() {
    //freopen("out.txt", "w", stdout);
    while (~scanf("%d", &n) && n) {
        ll S = 0;
        for (int i = 1; i <= n; i++) {
            scanf("%lld", &a[i]);
            S += a[i];
        }
        sum[0] = 0;
        for (int i = 1; i <= n; i++) sum[i] = sum[i-1] + a[i];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                dp[i][j] = -INF;
            }
        }
        ll suma = solve(1, n);
        ll sumb = S - suma;
        printf("%lld\n", suma - sumb);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hao_zong_yin/article/details/81842349