描述:博弈题目,双方可以数组任何一边取连续的的几个数组元素的值的和,但不能同时从两边去,可以从一边一次取到头 #include <cstdio> #include <cstring> #include <cstdlib> int n,sum; int arr[110]; int v[110][110]; int min(int x,int y) { return x>y?y:x; } int dp(int x,int y) { if(v[x][y]>sum) return v[x][y]; int c=0; for(int i=x; i<y; i++) c=min(c,dp(x,i)); for(int i=x+1; i<=y; i++) c=min(c,dp(i,y)); v[x][y]=arr[y]-arr[x-1]-c; return v[x][y]; } int main() { //freopen("a.txt","r",stdin); while(scanf("%d",&n)!=EOF) { if(!n) break; arr[0]=0; for(int i=1; i<=n; i++) { scanf("%d",&arr[i]); arr[i]+=arr[i-1]; } memset(v,-127,sizeof(v)); sum=v[0][0]; printf("%d\n",2*dp(1,n)-arr[n]); } return 0; }
作者:moyan_min 发表于2013-5-24 12:54:56 原文链接
阅读:64 评论:0 查看评论