题意:两个人A,B玩游戏,轮流玩,A 先取,每个人每次只准在右边或左边拿1个或多个数,每个人都采取最优策略尽量让自己的得分高
问A-B的最大值

// File Name: 10891.cpp // Author: zlbing // Created Time: 2013/1/23 17:46:22 #include<iostream> #include<string> #include<algorithm> #include<cstdlib> #include<cstdio> #include<set> #include<map> #include<vector> #include<cstring> #include<stack> using namespace std; #define MAXN 105 int A[MAXN]; int S[MAXN]; bool vis[MAXN][MAXN]; int d[MAXN][MAXN]; int dp(int i,int j) { if(vis[i][j])return d[i][j]; vis[i][j]=true; int ans=0; for(int k=i+1;k<=j;k++) ans=min(dp(k,j),ans); for(int k=i;k<j;k++) ans=min(dp(i,k),ans); d[i][j]=S[j]-S[i-1]-ans; return d[i][j]; } int main(){ int n; while(~scanf("%d",&n)) { if(!n)break; S[0]=0; for(int i=1;i<=n;i++) { scanf("%d",&A[i]); S[i]=S[i-1]+A[i]; } memset(vis,false,sizeof(vis)); int k=dp(1,n); printf("%d\n",2*k-S[n]); } return 0; }