Codeforces 354B 博弈, DP,记忆化搜索
题意:现在有一个字符矩阵,从左上角出发,每个人交替选择一个字符。如果最后字符a数目大于字符b,那么第一个人获胜,否则b获胜,否则平均。现在双方都不放水,问最后结果是什么?
思路:这题需要注意,选择的字符串不是一条单纯的路径,而是包括这个字符串的所有路径的并。
比如:
abc
bac
ccc
ab字符串其实是(1, 2)和(2, 1)的并,abc是(1, 3)和(3, 1)的并。
因为n最大只有20,那么对角线长度最长只有20,我们可以考虑状压,通过状压来更新状态,转移的时候枚举26个字母转移。
代码:
- #include <bits/stdc++.h>
- #define pii pair<int, int>
- #define INF 0x3f3f3f3f
- using namespace std;
- const int maxn = 20;
- vector<pii> a[maxn * 2];
- int id[maxn][maxn];
- bool v[40][1 << 20];
- int dp[40][1 << 20];
- char s[25][25];
- int n;
- int cal(char ch) {
- if(ch == 'a') return 1;
- else if(ch == 'b') return -1;
- return 0;
- }
- int dfs(int deep, int mask) {
- if(deep == n * 2 - 2) return 0;
- if(v[deep][mask]) return dp[deep][mask];
- int sz = a[deep].size();
- int ans;
- if(deep & 1) ans = -INF;
- else ans = INF;
- for (char c = 'a'; c <= 'z'; c++) {
- int add = cal(c);
- int Next_mask = 0;
- for (int j = 0; j < sz; j++) {
- if((mask >> j) & 1) {
- pii tmp = a[deep][j];
- int x = tmp.first, y = tmp.second;
- if(x < n - 1 && s[x + 1][y] == c)
- Next_mask |= (1 << id[x + 1][y]);
- if(y < n - 1 && s[x][y + 1] == c)
- Next_mask |= (1 << id[x][y + 1]);
- }
- }
- if(Next_mask) {
- if(deep & 1) ans = max(ans, add + dfs(deep + 1, Next_mask));
- else ans = min(ans, add + dfs(deep + 1, Next_mask));
- }
- }
- v[deep][mask] = 1;
- dp[deep][mask] = ans;
- return ans;
- }
- int main() {
- scanf("%d", &n);
- for (int i = 0; i < n; i++) {
- scanf("%s", s[i]);
- }
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++) {
- id[i][j] = a[i + j].size();
- a[i + j].push_back(make_pair(i, j));
- }
- int ans = dfs(0, 1);
- ans += cal(s[0][0]);
- if(ans > 0) printf("FIRST\n");
- else if(ans < 0) printf("SECOND\n");
- else printf("DRAW\n");
- }
Codeforces 354B 博弈, DP,记忆化搜索的更多相关文章
- CodeForces 398B 概率DP 记忆化搜索
题目:http://codeforces.com/contest/398/problem/B 有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了 ...
- 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...
- 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索
[题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...
- [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树
树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...
- poj1664 dp记忆化搜索
http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...
- 状压DP+记忆化搜索 UVA 1252 Twenty Questions
题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...
- 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. ...
- POJ 1088 DP=记忆化搜索
话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...
- Codeforces 148D Bag of mice:概率dp 记忆化搜索
题目链接:http://codeforces.com/problemset/problem/148/D 题意: 一个袋子中有w只白老鼠,b只黑老鼠. 公主和龙轮流从袋子里随机抓一只老鼠出来,不放回,公 ...
- CodeForces 173C Spiral Maximum 记忆化搜索 滚动数组优化
Spiral Maximum 题目连接: http://codeforces.com/problemset/problem/173/C Description Let's consider a k × ...
随机推荐
- CSS实现三级菜单[转]
头部导航条布局 html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...
- webdriver原理
WebDriver 安装C/S构架设计的: 代码(客户端)--->驱动(解析代码)----->浏览器(服务端) 代码通过http请求发给浏览器驱动,驱动解析代码把他们发给浏览器,浏览器执行 ...
- 注意!黑客可以通过CSS3功能攻击浏览器
随着通过HTML5和CSS3引入的惊人数量的功能,浏览器的攻击面也相应增长.因此,这些功能之间的交互可能会导致意外行为影响用户的安全,这并不奇怪.在这篇文章中,中国知名黑客安全组织东方联盟描述了这样一 ...
- BZOJ2695 保护古迹
非常带劲之计算几何 写的头晕= = 就是平面图转对偶图然后最小割 由于p非常小我们枚举所有保护状态然后割一下 建图真的烦 就是把区域划分出来看一下每一个古迹点是否被小区域包含[好像也可以写点定位] 然 ...
- centos 6.5 配置网络
编辑 vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改内容 DEVICE="eth0" BOOTPROTO="static& ...
- 【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 ...
- 第三周作业—N42-虚怀若谷
一.显示/etc/目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录 ls /etc/[^[:alpha:]][[:alpha:]]* 二.复制/etc/目录下所有以p开头的 ...
- python不能运行
运行python文件出现,报错please select a valid interpreter 这是因为没有选择interpreter 就是更改目录时需要重新选择pytho解析器 解决方法如下 更 ...
- ldd3 编写scull尝试
快速参考: #include <linux/types.h> dev_t dev_t is the type used to represent device numbers within ...
- Java常用数据结构Set, Map, List
1. Set Set相对于List.Map是最简单的一种集合.集合中的对象不按特定的方式排序,并且没有重复对象. 特点: 它不允许出现重复元素: 不保证和政集合中元素的顺序 允许包含值为null的元素 ...