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 }

你可能感兴趣的:(USACO)