博客
关于我
Codeforces Round #459 (Div. 1) B. MADMAX(博弈+DP+记忆化搜索)
阅读量:390 次
发布时间:2019-03-05

本文共 1372 字,大约阅读时间需要 4 分钟。

代码展示了一个用于图论问题的深度优先搜索(DFS)算法,采用记忆化搜索技术来优化性能。代码定义了一个三维数组dp,其中dp[i][j][k]表示在节点i作为先手,节点j作为后手,边权为k的情况下,当前玩家是否能够获胜。通过递归函数dfs,算法对每个状态进行分析并存储结果。
代码的核心逻辑是遍历每个节点的所有邻接点,对于每个邻接点,检查其边权是否满足当前轮的要求,并递归调用dfs函数判断对手是否处于劣势。如果对手无法获胜,则当前玩家可以获胜,否则无法获胜。
代码的初始化部分读取输入数据,构建图的邻接表,并通过调用dfs函数对所有可能的状态进行计算。最终,代码输出每个节点对应的胜负结果,若dp[i][j][0]为0则表示先手无法获胜,否则先手可以获胜。

#include 
#include
using namespace std;
const int maxn = 150;
int dp[maxn][maxn][maxn];
vector
> g[maxn];
char c;
int dfs(int x, int y, int now) {
if (dp[x][y][now] >= 0) return dp[x][y][now];
for (auto it : g[x]) {
if (it.second >= now && dfs(y, it.first, it.second) == 0) {
dp[x][y][now] = 1;
return 1;
}
}
dp[x][y][now] = 0;
return 0;
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++i) {
int u, v;
char c;
scanf("%d%d", &u, &v);
scanf("%c", &c);
g[u].push_back({v, c});
}
memset(dp, -1, sizeof(dp));
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
dfs(i, j, 0);
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (dp[i][j][0] == 0) {
printf("B");
} else {
printf("A");
}
printf("\n");
}
}
}

转载地址:http://olewz.baihongyu.com/

你可能感兴趣的文章
Node-RED中实现HTML表单提交和获取提交的内容
查看>>
Node-RED中将CSV数据写入txt文件并从文件中读取解析数据
查看>>
Node-RED中建立TCP服务端和客户端
查看>>
Node-RED中建立Websocket客户端连接
查看>>
Node-RED中解析高德地图天气api的json数据显示天气仪表盘
查看>>
Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
查看>>
Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
查看>>
Node-RED订阅MQTT主题并调试数据
查看>>
node-request模块
查看>>
Node.js 8 中的 util.promisify的详解
查看>>
node.js url模块
查看>>
Node.js Web 模块的各种用法和常见场景
查看>>
Node.js 函数是什么样的?
查看>>
Node.js 切近实战(七) 之Excel在线(文件&文件组)
查看>>
node.js 初体验
查看>>
Node.js 历史
查看>>
Node.js 在个推的微服务实践:基于容器的一站式命令行工具链
查看>>
Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
查看>>
Node.js 异步模式浅析
查看>>
node.js 怎么新建一个站点端口
查看>>