题意:现在有一个字符矩阵,从左上角出发,每个人交替选择一个字符。如果最后字符a数目大于字符b,那么第一个人获胜,否则b获胜,否则平均。现在双方都不放水,问最后结果是什么?

思路:这题需要注意,选择的字符串不是一条单纯的路径,而是包括这个字符串的所有路径的并。

比如:

abc

bac

ccc

ab字符串其实是(1, 2)和(2, 1)的并,abc是(1, 3)和(3, 1)的并。

因为n最大只有20,那么对角线长度最长只有20,我们可以考虑状压,通过状压来更新状态,转移的时候枚举26个字母转移。

代码:

  1. #include <bits/stdc++.h>
  2. #define pii pair<int, int>
  3. #define INF 0x3f3f3f3f
  4. using namespace std;
  5. const int maxn = 20;
  6. vector<pii> a[maxn * 2];
  7. int id[maxn][maxn];
  8. bool v[40][1 << 20];
  9. int dp[40][1 << 20];
  10. char s[25][25];
  11. int n;
  12. int cal(char ch) {
  13. if(ch == 'a') return 1;
  14. else if(ch == 'b') return -1;
  15. return 0;
  16. }
  17. int dfs(int deep, int mask) {
  18. if(deep == n * 2 - 2) return 0;
  19. if(v[deep][mask]) return dp[deep][mask];
  20. int sz = a[deep].size();
  21. int ans;
  22. if(deep & 1) ans = -INF;
  23. else ans = INF;
  24. for (char c = 'a'; c <= 'z'; c++) {
  25. int add = cal(c);
  26. int Next_mask = 0;
  27. for (int j = 0; j < sz; j++) {
  28. if((mask >> j) & 1) {
  29. pii tmp = a[deep][j];
  30. int x = tmp.first, y = tmp.second;
  31. if(x < n - 1 && s[x + 1][y] == c)
  32. Next_mask |= (1 << id[x + 1][y]);
  33. if(y < n - 1 && s[x][y + 1] == c)
  34. Next_mask |= (1 << id[x][y + 1]);
  35. }
  36. }
  37. if(Next_mask) {
  38. if(deep & 1) ans = max(ans, add + dfs(deep + 1, Next_mask));
  39. else ans = min(ans, add + dfs(deep + 1, Next_mask));
  40. }
  41. }
  42. v[deep][mask] = 1;
  43. dp[deep][mask] = ans;
  44. return ans;
  45. }
  46. int main() {
  47. scanf("%d", &n);
  48. for (int i = 0; i < n; i++) {
  49. scanf("%s", s[i]);
  50. }
  51. for (int i = 0; i < n; i++)
  52. for (int j = 0; j < n; j++) {
  53. id[i][j] = a[i + j].size();
  54. a[i + j].push_back(make_pair(i, j));
  55. }
  56. int ans = dfs(0, 1);
  57. ans += cal(s[0][0]);
  58. if(ans > 0) printf("FIRST\n");
  59. else if(ans < 0) printf("SECOND\n");
  60. else printf("DRAW\n");
  61. }

  

Codeforces 354B 博弈, DP,记忆化搜索的更多相关文章

  1. CodeForces 398B 概率DP 记忆化搜索

    题目:http://codeforces.com/contest/398/problem/B 有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了 ...

  2. 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索

    题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...

  3. 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索

    [题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...

  4. [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树

    树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...

  5. poj1664 dp记忆化搜索

    http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...

  6. 状压DP+记忆化搜索 UVA 1252 Twenty Questions

    题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...

  7. ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. Poor Ramzi -dp+记忆化搜索

    ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. ...

  8. POJ 1088 DP=记忆化搜索

    话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...

  9. Codeforces 148D Bag of mice:概率dp 记忆化搜索

    题目链接:http://codeforces.com/problemset/problem/148/D 题意: 一个袋子中有w只白老鼠,b只黑老鼠. 公主和龙轮流从袋子里随机抓一只老鼠出来,不放回,公 ...

  10. CodeForces 173C Spiral Maximum 记忆化搜索 滚动数组优化

    Spiral Maximum 题目连接: http://codeforces.com/problemset/problem/173/C Description Let's consider a k × ...

随机推荐

  1. CSS实现三级菜单[转]

    头部导航条布局 html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...

  2. webdriver原理

    WebDriver 安装C/S构架设计的: 代码(客户端)--->驱动(解析代码)----->浏览器(服务端) 代码通过http请求发给浏览器驱动,驱动解析代码把他们发给浏览器,浏览器执行 ...

  3. 注意!黑客可以通过CSS3功能攻击浏览器

    随着通过HTML5和CSS3引入的惊人数量的功能,浏览器的攻击面也相应增长.因此,这些功能之间的交互可能会导致意外行为影响用户的安全,这并不奇怪.在这篇文章中,中国知名黑客安全组织东方联盟描述了这样一 ...

  4. BZOJ2695 保护古迹

    非常带劲之计算几何 写的头晕= = 就是平面图转对偶图然后最小割 由于p非常小我们枚举所有保护状态然后割一下 建图真的烦 就是把区域划分出来看一下每一个古迹点是否被小区域包含[好像也可以写点定位] 然 ...

  5. centos 6.5 配置网络

    编辑 vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改内容 DEVICE="eth0" BOOTPROTO="static& ...

  6. 【leetcode】714. Best Time to Buy and Sell Stock with Transaction Fee

    题目如下: Your are given an array of integers prices, for which the i-th element is the price of a given ...

  7. 第三周作业—N42-虚怀若谷

    一.显示/etc/目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录 ls  /etc/[^[:alpha:]][[:alpha:]]* 二.复制/etc/目录下所有以p开头的 ...

  8. python不能运行

    运行python文件出现,报错please select a valid interpreter 这是因为没有选择interpreter  就是更改目录时需要重新选择pytho解析器 解决方法如下 更 ...

  9. ldd3 编写scull尝试

    快速参考: #include <linux/types.h> dev_t dev_t is the type used to represent device numbers within ...

  10. Java常用数据结构Set, Map, List

    1. Set Set相对于List.Map是最简单的一种集合.集合中的对象不按特定的方式排序,并且没有重复对象. 特点: 它不允许出现重复元素: 不保证和政集合中元素的顺序 允许包含值为null的元素 ...