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 }