fl,r,0/1,0/1 表示区间 [l,r] ,当 A 先取 / B 先取 时,A/B 所得的最大值。
转移显然。具体看代码。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll sum[105],f[105][105][2][2];
int pos[105][105][2];
void dp(int l,int r,int type){
if(l>r)return;
if(pos[l][r][type]) return;
pos[l][r][type]=1;
if(l+1==r){
f[l][r][type][type]=max(sum[l]-sum[l-1],sum[r]-sum[r-1]);
f[l][r][type][type^1]=min(sum[l]-sum[l-1],sum[r]-sum[r-1]);
return;
}
if(l==r) return f[l][r][type][type]=sum[r]-sum[l-1],f[l][r][type][type^1]=0,void(0);
f[l][r][type][type]=-0x3f3f3f3f3f3f3f3f;
for(int i=l;i<=r;++i){
dp(i+1,r,type^1);
//if(l==1&&r==4) cout<<i+1<<" "<<r<<" "<<f[i+1][r][type]<<" "<<f[i+1][r][type^1]<<" "<<sum[i]-sum[l-1]<<endl;
if(f[i+1][r][type^1][type]+sum[i]-sum[l-1]>f[l][r][type][type])
f[l][r][type][type]=f[i+1][r][type^1][type]+sum[i]-sum[l-1],
f[l][r][type][type^1]=f[i+1][r][type^1][type^1];
}
for(int i=r;i>=l;--i){
dp(l,i-1,type^1);
if(f[l][i-1][type^1][type]+sum[r]-sum[i-1]>f[l][r][type][type])
f[l][r][type][type]=f[l][i-1][type^1][type]+sum[r]-sum[i-1],
f[l][r][type][type^1]=f[l][i-1][type^1][type^1];
}
}
int main(){
// freopen("farcry.in","r",stdin);
// freopen("farcry.out","w",stdout);
int n;
while(1){
scanf("%d",&n);
if(n==0) break;
for(int i=1;i<=n;++i)
scanf("%lld",&sum[i]),sum[i]=sum[i-1]+sum[i];
memset(pos,0,sizeof(pos));
memset(f,0,sizeof(f));
dp(1,n,0);
printf("%lld\n",f[1][n][0][0]-f[1][n][0][1]);
}
return 0;
}