题意:
Max和Lucas两人在DAG(边上有权重,为字符ASCⅡ码)顶点上进行博弈游戏。Max先行,且每人此轮走的边的权值需不小于对手上一轮走的边的权值,若某人无路可走,则输掉游戏。求Max和Lucas两人在任意起点的博弈结果。
思路:
dp[i][j][c]:当Max位于i,Lucas位于j,且此前的最大权值为c,当Max移动时,Max的输赢情况(1为胜,0为负)。
如果存在k,
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100 + 10;
int dp[MAXN][MAXN][30];
int n, m;
vector<pair<int, int > > graph[MAXN];
int dfs(int i, int j, int c)
{
if(dp[i][j][c] >= 0)
return dp[i][j][c];
for(int k = 0; k < graph[i].size(); k++)
{
if(graph[i][k].second >= c && !dfs(j, graph[i][k].first, graph[i][k].second))
{
//cout << "find!\n";
return dp[i][j][c] = 1;
}
}
return dp[i][j][c] = 0;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++)
{
int a, b; char c;
scanf("%d %d %c", &a, &b, &c);
graph[a].push_back(make_pair(b, c - 'a'));
}
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++)
{
printf("%c", dp[i][j][0] ? 'A' : 'B');
}
printf("\n");
}
return 0;
}