Codeforces 918D/917B - MADMAX
2024-08-31 02:32:19
传送门: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 ;
}
最新文章
- [Linux] 账户管理命令(一)
- selenium 关于富文本的处理
- 使用Adobe Edge Inspect在各种设备中轻松测试同一页面
- access denied (";java.net.SocketPermission"; ";localhost:1527"; ";listen,resolve";)
- oracle 树形SQL
- Leetcode#106 Construct Binary Tree from Inorder and Postorder Traversal
- SWD应用接口
- Mybatis 学习历程
- Cogs 1070. [焦作一中2012] 玻璃球游戏 带权并查集,逆序处理
- 解决linux下部署科大讯飞时的版本过低问题
- C# Socket网络编程
- Unity3d外包团队:Unity3d最新版本更新内容
- man statd(rpc.statd中文手册)
- 017-并发编程-Condition
- 模板学习实践二 pointer
- 【CF887E】Little Brother 二分+几何
- nyoj 数独
- Socket通信原理简介
- linux 文件处理大杂烩
- 最长上升子序列(LIS)n2 nlogn算法解析
热门文章
- jQuery 自定义动画效果
- Java代码规范_插件_阿里java开发手册
- 可写可选dropdownlist(只测试过ie)
- thinkphp结合云之讯做短信验证码
- [Swift通天遁地]九、拔剑吧-(3)创建多种自定义Segment分段样式的控件
- jQuery获取Select元素
- centos语言设置
- An problem about date 根据年月日计算 星期几
- 【洛谷3224/BZOJ2733】[HNOI2012]永无乡 (Splay启发式合并)
- [转]asp.net MVC 常见安全问题及解决方案