版权声明:欢迎大家转载,转载请注明出处 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;
}