博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 4597 Play Game(记忆化搜索)
阅读量:4519 次
发布时间:2019-06-08

本文共 1433 字,大约阅读时间需要 4 分钟。

题目大意:给出两堆牌,仅仅能从最上和最下取,然后两个人轮流取,都依照自己最优的策略。问说第一个人对多的分值。

解题思路:记忆化搜索,状态出来就很水,dp[fl][fr][sl][sr][flag],表示第一堆牌上边取到fl,以下取到fr,相同sl。sr为第二堆牌,flag为第几个人在取。假设是第一个人,dp既要尽量大,假设是第二个人,那么肯定尽量小。

#include 
#include
#include
using namespace std;const int N = 25;const int INF = 0x3f3f3f3f;int n, f[N], s[N], dp[N][N][N][N][2];void init () { memset(dp, -1, sizeof(dp)); scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &f[i]); for (int i = 1; i <= n; i++) scanf("%d", &s[i]);}int solve (int fl, int fr, int sl, int sr, int flag) { int& ans = dp[fl][fr][sl][sr][flag]; if (fl > fr && sl > sr) return ans = 0; if (ans != -1) return ans; if (flag) { ans = 0; if (fl <= fr) { ans = max(ans, solve(fl+1, fr, sl, sr, 1-flag) + f[fl]); ans = max(ans, solve(fl, fr-1, sl, sr, 1-flag) + f[fr]); } if (sl <= sr) { ans = max(ans, solve(fl, fr, sl+1, sr, 1-flag) + s[sl]); ans = max(ans, solve(fl, fr, sl, sr-1, 1-flag) + s[sr]); } } else { ans = INF; if (fl <= fr) { ans = min(ans, solve(fl+1, fr, sl, sr, 1-flag)); ans = min(ans, solve(fl, fr-1, sl, sr, 1-flag)); } if (sl <= sr) { ans = min(ans, solve(fl, fr, sl+1, sr, 1-flag)); ans = min(ans, solve(fl, fr, sl, sr-1, 1-flag)); } } return ans;}int main () { int cas; scanf("%d", &cas); while (cas--) { init (); printf("%d\n", solve(1, n, 1, n, 1)); } return 0;}

转载于:https://www.cnblogs.com/yangykaifa/p/6780103.html

你可能感兴趣的文章
python 学习(pip工具的安装)
查看>>
博客园在我的博客添加点击小心心特效
查看>>
如何简单解释 MapReduce算法
查看>>
微软Office Online服务安装部署(二)
查看>>
从 0 到 1 实现 React 系列 —— 1.JSX 和 Virtual DOM
查看>>
面向接口编程详解(二)——编程实例
查看>>
解决java.lang.NoClassDefFoundError: org/apache/log4j/Level
查看>>
端口号
查看>>
mysql for macOS安装
查看>>
iOS中的KeyChain的用途
查看>>
jquery与checkbox的checked属性的问题
查看>>
HDU5092——Seam Carving(动态规划+回溯)(2014上海邀请赛重现)
查看>>
java 格式化字符串
查看>>
[.Net]轻量ORM——Dapper
查看>>
语言基础
查看>>
C# : 操作Word文件的API - (将C# source中的xml注释转换成word文档)
查看>>
C#中字符串转换成枚举类型的方法
查看>>
psplash
查看>>
git的安装和简单使用
查看>>
20151024-1025-威海-第5届全国高校软件工程专业教育年会参会总结
查看>>