题意:在给出的n个数中,有A,B两个人,A先取(从左或右取一个或多个数),然后B同样如此,两个人都想着取的数的和是最大,并让对方尽量总和最小,当然可能还有剩,如果最后的数非常小的话,求最大的极差,因为A和B最后的总和一定是Sum,是固定的,所以A-B=2*A-Sum,所以我们尽量让A最大,用dp[i][j]表示从i-j最大的是多少,我们要知道的是dp[1][n],至于怎么样尽量大呢,一定是我们每次都只能从两边取的情况,自己写几个数列仔细想想
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 110;
int dp[MAXN][MAXN],arr[MAXN],sum[MAXN],vis[MAXN][MAXN],n;
int DP(int l,int r){
if (vis[l][r])
return dp[l][r];
vis[l][r] = 1;
int ans = 0;
for (int i = l + 1; i <= r; i++)
ans = min(ans,DP(i,r));
for (int i = l; i < r; i++)
ans = min(ans,DP(l,i));
dp[l][r] = sum[r] - sum[l-1] - ans;
return dp[l][r];
}
int main(){
while (scanf("%d",&n) != EOF && n){
sum[0] = 0;
for (int i = 1; i <= n; i++){
scanf("%d",&arr[i]);
sum[i] = sum[i-1] + arr[i];
}
memset(vis,0,sizeof(vis));
int ans = DP(1,n);
printf("%d\n",2*ans-sum[n]);
}
return 0;
}