A Game USACO 3.3 (DP阵亡)

DP算法解析
本文通过一道具体题目解析了DP算法的应用,给出了状态转移方程dp[i][j]=sum[i][j]-min(dp[i+1][j],dp[i][j-1]),并提供了完整的C++实现代码。

这题我是完全不知道从何下手,何为当前最优,而且第二个人也要是最优考虑。

题解给的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 }

 

转载于:https://www.cnblogs.com/cavehubiao/p/3375241.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值