MADMAX -每天一把CF - 20201116

这篇博客记录了作者在2020年11月16日解决Codeforces问题918D的过程,这是一个涉及图上动态规划的题目。作者提到,虽然题目难度较大,但思路来源于其他博主的文章。博客内容包括题目的描述、解题思路和代码实现,但并未详细展开解释思路。
摘要由CSDN通过智能技术生成

2020-11-16

dp

918D 1700

题目

原题链接:https://codeforces.com/problemset/problem/918/D

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YhPY22vo-1605541910705)(918D.assets/image-20201116224341633.png)]

思路

题目大意:给定一个 DAG,每个边的权值为一个字母。两人初始各占据一个顶点(可以重合),轮流移动(沿着一条边从一个顶点移动到另一个顶点),要求每次边上的权值 ≥上一次的权值。无法移动者输。要求:对所有可能的初始情况,给出一张胜负表。

思路:

图上DP我真的一脸懵逼,2000+的题都没这恐怖,图涂

思路来自 https://www.cnblogs.com/kkkkahlua/p/8386936.html

思路我就不写了 涂

大佬强的

代码实现

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
#include <string>
#include <queue>
using namespace std;

#define mes0(c) memset((c),0,sizeof(c))
#define mesi(c) memset((c),ifi,sizeof(c))
#define mes(c,n) memset((c),(n),sizeof(c))
#define fsios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define rep1(n) for (int i=1;i<=(n);i++)
#define rep2(n) for (int j=1;j<=(n);j++)
#define inp(a, n) for (int i = 1; i <= (n); i++) cin >> a[i];
#define ll long long
#define fi first
#define se second

const ll MAX = 200;
const int ifi = 0x3f3f3f3f;
const int mod = 1e9 + 7;


int n, m;
int mp[MAX][MAX];
int dp[MAX][MAX][30];
int vis[MAX][MAX][30];

bool dfs(int u, int v, int w) {
	if (vis[u][v][w]) return dp[u][v][w];//记忆化
	if (u == v) return dp[u][v][w] = false;//同起点先手必输
	if (mp[u][v] && w <= mp[u][v]) return dp[u][v][w] = true;//uv有路且可行则先手必赢

	vis[u][v][w] = 1;
	for (int i = 1; i <= n; i++) {
		if (mp[u][i] && w <= mp[u][i] && !dfs(v, i, mp[u][i]))
			return dp[u][v][w] = true;
	}
	return dp[u][v][w] = false;
}

int main() {
	fsios;

	while (cin >> n >> m) {
		int u, v; char c;
		mes0(mp); mes0(dp); mes0(vis);

		rep1(m) {
			cin >> u >> v >> c;
			mp[u][v] = c - 'a' + 1;
		}

		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				cout << (dfs(i, j, mp[i][j]) == false ? 'B' : 'A');
			}
			cout << endl;
		}

	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值