A Game USACO 3.3 (DP阵亡)
这题我是完全不知道从何下手,何为当前最优,而且第二个人也要是最优考虑。
题解给的dp,
状态方程 dp[i][j]=sum[i][j]-min(dp[i+1][j],do[i][j-1]);
sum[i][j]表示i到j总价值 dp[i][j]表示从i 到j里先选注意是先选人所能够获得的最优。
感觉比较巧妙,值得mark下
1 /* 2 3 ID: hubiao cave 4 5 PROG: game1 6 7 LANG: C++ 8 9 */ 10 11 12 13 14 #include<iostream> 15 16 #include<fstream> 17 18 #include<string> 19 20 using namespace std; 21 22 23 24 int main() 25 26 { 27 28 ifstream fin("game1.in"); 29 30 ofstream fout("game1.out"); 31 int n; 32 int dp[102][102],sum[102][102]; 33 34 fin>>n; 35 for(int i=1;i<=n;i++) 36 { 37 fin>>dp[i][i]; 38 sum[i][i]=dp[i][i]; 39 } 40 41 for(int i=1;i<=n;i++) 42 for(int j=i+1;j<=n;j++) 43 sum[i][j]=sum[i][j-1]+sum[j][j]; 44 45 for(int i=1;i<=n;i++) 46 for(int j=1;j+i<=n;j++) 47 dp[j][j+i]=sum[j][j+i]-min(dp[j+1][j+i],dp[j][j+i-1]); 48 49 fout<<dp[1][n]<<" "<<sum[1][n]-dp[1][n]<<endl; 50 return 0; 51 52 53 }