POJ-1678 I Love this Game!(博弈论)
2016-07-20 11:05
411 查看
题目链接
6 1 2
1 3 -2 5 -3 6
2 1 2
-2 -1
2 1 2
1 0
0
1
POJ-1678 I Love this Game!
题目大意
给定n个数,两人轮流取递增的数,先手先取[a,b]内的数,此后,后取的数与前一个数的差值在[a,b]内,求先手获得数的和减去后手获得数的和的最大值?Sample Input
36 1 2
1 3 -2 5 -3 6
2 1 2
-2 -1
2 1 2
1 0
Sample Output
-30
1
思路
这种博弈DP以前做过很多次,但是这回状态是不连续的就不知道怎么转移了,其实只用记忆化搜索即可。代码
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF=0x3f3f3f3f; int n,a,b,dp[10005];//dp[i]表示先手取第i个数时能获得的最大分差 int num[10005]; int DP(int i) { if(dp[i]!=-INF) { return dp[i]; } int opp=-INF;//对手在这种情况下能获得的最大分差 for(int j=i+1;j<n;++j) {//由于都是最优策略,所以对手一定会选择分差最大的取法 if(a<=num[j]-num[i]&&num[j]-num[i]<=b) { opp=max(opp,DP(j)); } } if(opp==-INF) { dp[i]=num[i]; } else { dp[i]=num[i]-opp; } return dp[i]; } int solve() { int ans=-INF; for(int i=0;i<n;++i) { if(a<=num[i]&&num[i]<=b) { ans=max(ans,DP(i)); } } return ans==-INF?0:ans; } int main() { int T; scanf("%d",&T); while(T-->0) { scanf("%d%d%d",&n,&a,&b); for(int i=0;i<n;++i) { scanf("%d",num+i); dp[i]=-INF; } sort(num,num+n); printf("%d\n",solve()); } return 0; }
相关文章推荐
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android dpi,dip,dp的概念以及屏幕适配
- 博弈论
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- IT审计【转载】
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告