Codeforces 918D/917B - MADMAX
传送门:http://codeforces.com/contest/918/problem/D
本题是一个组合游戏问题——DAG上的动态规划问题。
有一张有向无环图(DAG)。有两个玩家在这张图上进行一个游戏:初始时,玩家A、B各占据一个结点,之后轮流沿着有向边移动;移动时的边权是不下降的。无法移动者输。
请打印一个n×n矩阵,这个矩阵的元代表获胜方(A/B),其i行j列元的含义如下:玩家A的初始位置为结点i,玩家B的初始位置为结点j。
对于DAG上的组合游戏,可以考虑DP。
定义布尔变量dp(u,v,c),代表当先手的初始位置为结点u,后手的初始位置为结点v,且上一次移动的边权为c时,先手是否能移动。则:
若存在有向边<u,x>,使得c≤cost<u,x>,且dp(v,x,cost<u,x>)=0,于是,一旦先手到达结点x后,后手将无法移动:于是先手必胜,即dp(u,v,c)=1;否则先手必败,即dp(u,v,c)=0。
参考程序如下:
#include <stdio.h>
#include <string.h>
#define MAX_N 101
#define MAX_C 26 int n, m;
int adj[MAX_N][MAX_N];
int dp[MAX_N][MAX_N][MAX_C]; int dfs(int u, int v, int c)
{
if (dp[u][v][c] != -) return dp[u][v][c];
for (int x = ; x <= n; x++) {
if (adj[u][x] >= c && !dfs(v, x, adj[u][x]))
return dp[u][v][c] = ;
}
return dp[u][v][c] = ;
} int main(void)
{
scanf("%d%d", &n, &m);
memset(adj, -, sizeof(adj));
memset(dp, -, sizeof(dp));
while (m--) {
int u, v;
char ch;
scanf("%d%d %c", &u, &v, &ch);
adj[u][v] = ch - 'a';
}
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++) {
if (dfs(i, j, )) putchar('A');
else putchar('B');
}
putchar('\n');
}
return ;
}
Codeforces 918D/917B - MADMAX的更多相关文章
- Codeforces 918D - MADMAX
918D - MADMAX 思路: dp+记忆化搜索 状态:dp[i][j][w]表示先手在i节点,后手在j节点,这一轮的字母为w的结果,如果为true,则表示先手必赢,否则后手必赢. 状态转移:如果 ...
- CodeForces 918D MADMAX(博弈+记忆化搜索)
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
- Codeforces 917B MADMAX (DP+博弈)
<题目链接> 题目大意:给定一个DAG图,其中图的边权是给定的字符所对应的ascii码,现在A先手,B后手,每次沿DAG图走一步,但是第i次走的边权一定要大于等于第i-1次走的边权(这里是 ...
- Codeforces 918D MADMAX 图上dp 组合游戏
题目链接 题意 给定一个 \(DAG\),每个边的权值为一个字母.两人初始各占据一个顶点(可以重合),轮流移动(沿着一条边从一个顶点移动到另一个顶点),要求每次边上的权值 \(\geq\) 上一次的权 ...
- Codeforces Round #459 (Div. 2) D. MADMAX DFS+博弈
D. MADMAX time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...
- Codeforces Round #459 (Div. 2):D. MADMAX(记忆化搜索+博弈论)
D. MADMAX time limit per test1 second memory limit per test256 megabytes Problem Description As we a ...
- Codeforces Round #459 (Div. 2):D. MADMAX(记忆化搜索+博弈论)
题意 在一个有向无环图上,两个人分别从一个点出发,两人轮流从当前点沿着某条边移动,要求经过的边权不小于上一轮对方经过的边权(ASCII码),如果一方不能移动,则判负.两人都采取最优策略,求两人分别从每 ...
- 【Codeforces Round #459 (Div. 2) D】MADMAX
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] f[x][y][z][2] 表示第一个人到了点x,第二个人到了点y,当前轮的字母(1..26),当前轮到谁走的情况下,谁赢. 写个记 ...
- codeforces的dp专题
1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...
随机推荐
- Quartz在.Net网站中的使用方法(附Demo)
现在做一个B/S项目需要用到计划任务,本来想自定写一个的,写了几句,突然想看看网上有没有现成可以用的.结果在苦寻之下找到了Quartz这个组件.看过之后感觉还不错.决定用它实现计划任务了.再找找看有没 ...
- bzoj2648
http://www.lydsy.com/JudgeOnline/problem.php?id=2648 kdtree裸题... 抄板子一边抄对了... 挺好理解的,就是说我们先找出中间的元素,然后小 ...
- MSXML2.XMLHTTP.4.0对象
一.使用步骤:1.创建XMLHTTP对象 //需MSXML4.0支持2.打开与服务端的连接,同时定义指令发送方式,服务网页(URL)和请求权限等.客户端通过Open命令打开与服务端的服务网页的连接.与 ...
- css bug(ie6兼容问题)
二.五大浏览器内核1.trident(MSHTML)(三叉戟:三叉线,三齿鱼叉) Gecko (壁虎) presto(迅速的) webkit(safari内核,Chrome内核原型,他是苹果公司自己的 ...
- AndroidManifest.xml详解
一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...
- A* 寻路算法[转载]
A* 寻路算法 转载地址:http://www.cppblog.com/christanxw/archive/2006/04/07/5126.html 原文地址: http://www.gamedev ...
- 使用Jquery.form.js ajax表单提交插件弹出下载提示框
现象: 使用jquery的from做ajax表单提交的时候,后台处理完毕返回json字符串,此时浏览器提示下载一个json文件而不是在success里面继续解析该json对象. 具体的原因: 浏览器兼 ...
- 自学Python十二 战斗吧Scrapy!
初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 还是先推荐几个学习的教程:Scrapy 0.2 ...
- ansible publishing service
# ansible 初始化服务机 - hosts: newserver vars: - basedir: opt tasks: - name: 安装常用依赖环境 yum: name={{ item } ...
- [ 51Nod 1327 ] 棋盘游戏
\(\\\) \(Description\) 给出一张\(N\times M\)的棋盘,每个格子最多放置一个棋子,一个合法的放置方案需满足: 每列至多放置一个棋子 对于第\(i\)行,前\(L_i\) ...