ZOJ3352【记忆化搜索】
先膜拜watashi!
前言:
比赛的时候,确定的是这是一个博弈,然后就是各种瞎猜,后面想到DP[ x ][ y ]代表x表白色的状态,y表黑色的状态,无果。挂机开始。GG、巨菜。
思路:
这一发记忆化搜索真是玄学。
仔细想想,首先我只要求权值最大,我不在乎输赢。
直接就是dp[i][j][k]代表当前白在 i 位置,黑在 j 位置,k为当前局势的赌资,dp存整个子结构包括本身的最大值。
然后记忆化搜索一发就可以了,很神奇。
记忆化搜索独有的味道:当前位置的状态为之前(其实是之后?)最优状态的转化(前身?)。
这里还有一点就是在搜的连续两步,其实分成了两个人的行为,所有当前的最大为之后那个人赢的相反数。(他赢即我输)
watashi美丽code:(小引用好酷)
#include <cstdio>
#include <vector>
#include <cstring> using namespace std; const int MAXN = 52;
const int INF = 65536; int d[MAXN];
vector<int> e[MAXN]; int b[MAXN][MAXN][MAXN * 4];
int c[MAXN][MAXN][MAXN * 4]; int gao(int x, int y, int z) {
if (c[x][y][100 + z] != -1) {
return b[x][y][100 + z];
}
int tmp;
int &ret = b[x][y][100 + z], &cnt = c[x][y][100 + z];
ret = (e[x].empty() && e[y].empty()) ? -z : -INF;
cnt = 1;
for (vector<int>::const_iterator i = e[x].begin(); i != e[x].end(); ++i) {
tmp = -gao(*i, y, z + d[*i]);
if (tmp > ret) {
ret = tmp;
cnt = 1;
} else if (tmp == ret) {
++cnt;
}
}
for (vector<int>::const_iterator i = e[y].begin(); i != e[y].end(); ++i) {
tmp = -gao(x, *i, z - d[*i]);
if (tmp > ret) {
ret = tmp;
cnt = 1;
} else if (tmp == ret) {
++cnt;
}
}
return ret;
} int main() {
int n, m, x, y, s, t; while (scanf("%d%d%d%d", &n, &m, &x, &y) != EOF) {
for (int i = 0; i < n; ++i) {
scanf("%d", &d[i]);
e[i].clear();
}
for (int i = 0; i < m; ++i) {
scanf("%d%d", &s, &t);
e[s].push_back(t);
}
memset(c, 0xff, sizeof(c));
gao(x, y, 1);
printf("%d %d\n", b[x][y][101], c[x][y][101]);
} return 0;
} //Run ID Submit Time Judge Status Problem ID Language Run Time(ms) Run Memory(KB) User Name Admin
//584 2010-07-16 19:50:54 Accepted 1074 C++ 860 4572 anotherpeg Source
ZOJ3352【记忆化搜索】的更多相关文章
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- 【BZOJ-3895】取石子 记忆化搜索 + 博弈
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 263 Solved: 127[Submit][Status][Discuss] D ...
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- zoj 3644(dp + 记忆化搜索)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从 ...
- loj 1044(dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...
- DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects
题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...
- HDU1978 记忆化搜索
How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- bzoj4562: [Haoi2016]食物链--记忆化搜索
这道题其实比较水,半个小时AC= =对于我这样的渣渣来说真是极大的鼓舞 题目大意:给出一个有向图,求入度为0的点到出度为0的点一共有多少条路 从入读为零的点进行记忆化搜索,搜到出度为零的点返回1 所有 ...
- 数位dp/记忆化搜索
一.引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an ...
随机推荐
- 06 HTTP协议缓存控制
一:HTTP协议缓存控制 第1次请求时 200 ok 第2次请求时 304 Not Modified 未修改状态 解释: 在网络上,有一些缓存服务器,另, 浏览器自身也有缓存功能. 当我们第一次某图片 ...
- WinCE下使用C#的几个小技巧
1.我们知道,在使用Windows的开发机上用C#启动一个外部程序的方法有很多,但这些方法用在使用WinCE的目标工控机上都无能为力,现在小嫚儿以打开一个IE为例,介绍如何在WinCE下使用C#来打开 ...
- 1185: [HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1426 Solve ...
- SEO大师分析的八条
- Hadoop实战-Flume之Source interceptor(十一)(2017-05-16 22:40)
a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source a1.sources.r1.type = ...
- The JSP specification requires that an attribute name is preceded by whitespace--异常
异常信息:org.apache.jasper.JasperException: /pages/selectedCourse.jsp (line: 4, column: 39) The JSP spec ...
- Block浅析一
1.在Block结构体中含有isa指针,这就证明了Block其实就是对象,并具有一般对象的所有功能. 2.Block是OC中的一种数据类型,在iOS开发中被广泛使用. 3.block的应用 (1)遍历 ...
- HDU2049 不容易系列之(4)考新郎 —— 错排
题目链接:https://vjudge.net/problem/HDU-2049 不容易系列之(4)——考新郎 Time Limit: 2000/1000 MS (Java/Others) Me ...
- SpringMVC与Struts2区别与比较
1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上Spr ...
- {{badmatch, {error, eexist}}
今天在编译cowboy工程在resolve release build时提示编译错误:{{badmatch, {error, eexist}} 后经调查可能是因为rebar的bug导致的,可是删除_b ...