USACO 3.3 A Game(DP)

    这个问题还是很有意思的,两个人分别按最优策略从两头取数,问最后的结果。

    很简单的一个思路是爆搜就行,当然肯定会超时的。记忆化 一下,就过了。代码真短啊。。。

 1 /*
 2      ID: cuizhe
 3      LANG: C++
 4      TASK: game1
 5 */
 6 #include <iostream>
 7 #include <cstdio>
 8 #include <cstring>
 9 #include <cmath>
10 using namespace std;
11 int sum[101],dp[101][101],p[101];
12 int dfs(int L,int R)
13 {
14     if(dp[L][R] > 0)
15     return dp[L][R];
16     if(L == R)
17     return p[L];
18     dp[L][R] = max(sum[R]-sum[L]-dfs(L+1,R)+p[L],sum[R-1]-sum[L-1]-dfs(L,R-1)+p[R]);
19     return dp[L][R];
20 }
21 int main()
22 {
23     int n,i,cum = 0;
24     freopen("game1.in","r",stdin);
25     freopen("game1.out","w",stdout);
26     scanf("%d",&n);
27     for(i = 1;i <= n;i ++)
28     {
29         scanf("%d",&p[i]);
30         sum[i] = sum[i-1] + p[i];
31         cum += p[i];
32     }
33     printf("%d %d\n",dfs(1,n),cum-dfs(1,n));
34     return 0;
35 }
posted @ 2012-12-02 19:32  Naix_x  阅读(191)  评论(0编辑  收藏  举报