题意:给定两个人的起始位置,每人走一步,直到不能走,问最后谁赢。每个人走的必须比另一个人大。
记忆化搜索水题,还是对搜索不太熟悉啊
#include<bits/stdc++.h>
#define mem(a,b) memset((a),b,sizeof(a))
typedef long long ll;
const int N=100010;
using namespace std;
int ver[10010],Next[10010],head[110],edge[10010];
int tot;
void add(int x,int y,int z)
{
ver[++tot]=y;edge[tot]=z;Next[tot]=head[x];head[x]=tot;
}
int dp[110][110][30];
int dfs(int ii,int jj,int kk)
{
if(dp[ii][jj][kk])
return dp[ii][jj][kk];
int x=ii;
for(int i=head[x];i;i=Next[i])
{
int y=ver[i],z=edge[i];
if(z<kk)
continue;
if(dfs(jj,y,z)==2)
return dp[ii][jj][kk]=1;
}
return dp[ii][jj][kk]=2;
}
int main()
{
for(int i=0;i<110;i++)
for(int j=0;j<110;j++)
for(int k=0;k<30;k++)
dp[i][j][k]=0;
int n,m;
scanf("%d%d",&n,&m);
tot=0;
int x,y;char z;
for(int i=1;i<=m;i++)
{
scanf("%d %d %c",&x,&y,&z);
int zz=z-'a'+1;
add(x,y,zz);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dfs(i,j,0)==1)
printf("A");
else
printf("B");
}
printf("\n");
}
return 0;
}

本文解析了一道记忆化搜索的博弈题目,通过构建图结构并使用深度优先搜索(DFS)算法,探讨了两人游戏的胜负策略。文章详细介绍了如何通过状态压缩和记忆化搜索优化递归过程,避免重复计算,提高算法效率。
1080

被折叠的 条评论
为什么被折叠?



