题目链接:hdu 4597 Play Game

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

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

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. const int N = 25;
  8. const int INF = 0x3f3f3f3f;
  9. int n, f[N], s[N], dp[N][N][N][N][2];
  10.  
  11. void init () {
  12. memset(dp, -1, sizeof(dp));
  13.  
  14. scanf("%d", &n);
  15. for (int i = 1; i <= n; i++)
  16. scanf("%d", &f[i]);
  17. for (int i = 1; i <= n; i++)
  18. scanf("%d", &s[i]);
  19. }
  20.  
  21. int solve (int fl, int fr, int sl, int sr, int flag) {
  22. int& ans = dp[fl][fr][sl][sr][flag];
  23. if (fl > fr && sl > sr)
  24. return ans = 0;
  25.  
  26. if (ans != -1)
  27. return ans;
  28.  
  29. if (flag) {
  30. ans = 0;
  31. if (fl <= fr) {
  32. ans = max(ans, solve(fl+1, fr, sl, sr, 1-flag) + f[fl]);
  33. ans = max(ans, solve(fl, fr-1, sl, sr, 1-flag) + f[fr]);
  34. }
  35.  
  36. if (sl <= sr) {
  37. ans = max(ans, solve(fl, fr, sl+1, sr, 1-flag) + s[sl]);
  38. ans = max(ans, solve(fl, fr, sl, sr-1, 1-flag) + s[sr]);
  39. }
  40. } else {
  41. ans = INF;
  42. if (fl <= fr) {
  43. ans = min(ans, solve(fl+1, fr, sl, sr, 1-flag));
  44. ans = min(ans, solve(fl, fr-1, sl, sr, 1-flag));
  45. }
  46.  
  47. if (sl <= sr) {
  48. ans = min(ans, solve(fl, fr, sl+1, sr, 1-flag));
  49. ans = min(ans, solve(fl, fr, sl, sr-1, 1-flag));
  50. }
  51. }
  52. return ans;
  53. }
  54.  
  55. int main () {
  56. int cas;
  57. scanf("%d", &cas);
  58. while (cas--) {
  59. init ();
  60. printf("%d\n", solve(1, n, 1, n, 1));
  61. }
  62. return 0;
  63. }

hdu 4597 Play Game(记忆化搜索)的更多相关文章

  1. HDU 4597 Play Game(记忆化搜索,深搜)

    题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的 ...

  2. HDU 4597 Play Game (记忆化搜索博弈DP)

    题意 给出2*n个数,分两列放置,每列n个,现在alice和bob两个人依次从任意一列的对头或队尾哪一个数,alice先拿,且两个人都想拿最多,问alice最后能拿到数字总和的最大值是多少. 思路 4 ...

  3. [HDU 1428]--漫步校园(记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1428 漫步校园 Time Limit: 2000/1000 MS (Java/Others)    M ...

  4. hdu 4856 Tunnels (记忆化搜索)

    Tunnels Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  5. HDU 5001 概率DP || 记忆化搜索

    2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP  測 ...

  6. HDU 3779 Railroad(记忆化搜索)

    Railroad Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Subm ...

  7. hdu 5535 Cake 构造+记忆化搜索

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 题意:给定n与m,其中1<= n <= 1e5,2 <= m <= 10;问 ...

  8. HDU 4597 Play Game 记忆化DP

    Play Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Proble ...

  9. HDU 4597 记忆化搜索

    ² 博弈取牌—记忆化搜索 题目描述: 有两副带有数字的牌,(数字>0)两人轮流取,取中了某张牌,自己的分数就加上牌上的数字,但只能从两端取,每人都会用最优的策略使得自己的分数最高.问A先取,他能 ...

随机推荐

  1. 【Trie】bzoj1212 [HNOI2004]L语言

    枚举每个文章里已经在Trie中被标记为可能是分割处的字符,然后再从此处跑Trie,继续向后标记.由于单词数很少,因此复杂度可以接受,O(n*m*Len). #include<cstdio> ...

  2. 13test04:捕鱼

    #include<iostream> using namespace std; int main() { int fish_sum,flag=1; for(fish_sum=6;flag; ...

  3. 【读书笔记】Elasticsearch集成Hadoop最佳实践

    前言 本文记录[Elasticsearch集成Hadoop最佳实战]读书笔记 本书总计209页,共7章节,计划时间:20180712-20180717 (每天至少40页) 本文代码地址: https: ...

  4. 静态NAT地址转换

    1.配置路由器端口ip(两个端口需要设置两个网段) Router(config)#inter f0/1 Router(confiog-if)#ip add 202.1.1.2 255.255.255. ...

  5. hadoop InputFormat getSplits

    /** Splits files returned by {@link #listStatus(JobConf)} when * they're too big.*/ public InputSpli ...

  6. Word中对象显示不完整

    选中上下文字后,右键没有段落,如果是图片的话是有的,那么我们可以点击菜单栏中段落的右下三角,在那设置单倍行距.

  7. 重新学习vue基础

    1.创建vue实例 var vm = new Vue({ el: '#example', //选择元素 data: {a:1} //基本数据 }) 2.模板语法 (一)基本语法 <span> ...

  8. python 输出所有大小写字母, range()以及列表切片

    所以在写的时候,只要把它们的ASCII列出,并转化成字符型chr 即可. print [chr(i) for i in range(65,91)]#所有大写字母 print [chr(i) for i ...

  9. 原型设计工具——Axure

    1,百度百科 http://baike.baidu.com/view/3332366.htm?from_id=5056136&type=syn&fromtitle=axure& ...

  10. ubuntu16.04 登录密码破解方法

    1:开机按Shift键,出现如下界面.(手速要快,Shift键要按时间久一点) 选择第二项 2:按回车键进入如下界面,然后选中有recovery mode的选项(第三项) 3:按e进入如下界面,并找到 ...