[USACO]A GAME (博弈+dp)

题意:从数列左右两边轮流取数,问你最优解的结果

解题思路: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 }
View Code
没有梦想,何谈远方
原文地址:https://www.cnblogs.com/zyue/p/3667202.html