题意:从数列左右两边轮流取数,问你最优解的结果
解题思路:dp, dp[i][j] = sum[i][j] - min(dp[i][j-1],dp[i+1][j]);
解题代码:

1 // File Name: gam3.c 2 // Author: darkdream 3 // Created Time: 2014年04月15日 星期二 19时49分52秒 4 /* 5 ID: dream.y1 6 PROG: game1 7 LANG: C++ 8 */ 9 #include<stdio.h> 10 #include<string.h> 11 #include<stdlib.h> 12 #include<time.h> 13 #include<math.h> 14 #include<limits.h> 15 int sum[300][300]; 16 int dp[300][300]; 17 int min(int a, int b) 18 { 19 return b > a ?a:b; 20 } 21 int main(){ 22 23 freopen("game1.in","r",stdin); 24 freopen("game1.out","w",stdout); 25 int n ; 26 scanf("%d",&n); 27 int a[300]; 28 memset(sum,0,sizeof(sum)); 29 for(int i = 1;i <= n;i ++) 30 { 31 scanf("%d",&a[i]); 32 for(int s = i ;s >= 1; s--) 33 for(int j = i ;j <= n; j ++) 34 { 35 sum[s][j] += a[i]; 36 } 37 } 38 for(int i = n;i >= 1;i --) 39 { 40 for(int j = i; j <= n; j ++) 41 dp[i][j] = sum[i][j] - min(dp[i][j-1],dp[i+1][j]); 42 } 43 printf("%d %d ",dp[1][n],sum[1][n] - dp[1][n]); 44 return 0 ; 45 }