题意:现在有一个字符矩阵,从左上角出发,每个人交替选择一个字符。如果最后字符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,记忆化搜索的更多相关文章

  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. lik模糊e查询语句,索引使用效果详解

    一.like查询与索引 在oracle里的一个超级大的表中,我们的where条件的列有建索引的话,会走索引唯一扫描INDEX UNIQUE SCAN.如select * from table wher ...

  2. java Random随机生成一个数

    package java05; import java.util.Random; /* Random随机生成一个数字 1.导包: import java.util.Random; 2.创建 Rando ...

  3. maven clean后 编译报错

    <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <config ...

  4. sql查询时间范围

    select * from table where Time>='2019-05-09 00:05:36' and Time<='2019-05-10 00:05:36'

  5. Python 石头 剪刀 布

    di = {1: '石头', 2: '剪刀', 3: '布'} def win(x, y): if len({x[0], y[0]}) == 1: print('平局.') else: if {x[0 ...

  6. 51nod 1714:B君的游戏(博弈 sg打表)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1714 nim游戏的一个变形,需要打出sg函数的表 #incl ...

  7. 【leetcode】126. Word Ladder II

    题目如下: 解题思路:DFS或者BFS都行.本题的关键在于减少重复计算.我采用了两种方法:一是用字典dic_ladderlist记录每一个单词可以ladder的单词列表:另外是用dp数组记录从star ...

  8. ps示例

    博客PS示例 一显示指定真正用户名(RUID)或用户ID的进程 打开另外一个终端 [root@centos72 ~]# id wang uid=1000(wang) gid=1000(wang) gr ...

  9. idea将本地项目推送到git远程库

    如何将本地项目推送到github远程仓库? 1. 在github上创建一个仓库,取名mybatis 2. 在idea中将项目交由git管理 注意,文件名会变红了, 说明这些文件在git工作区,但还没规 ...

  10. 几幅图片弄清DFT、DTFT、DFS的关系 数字信号处理

    原址:http://www.cnblogs.com/BitArt/archive/2012/11/24/2786390.html 很多同学学习了数字信号处理之后,被里面的几个名词搞的晕头转向,比如DF ...