Codeforces - Inna and Dima

题目链接:Codeforces - Inna and Dima


先DFS判环。然后DAG上最长路。

但是要注意最长路的时候,一定要从’D’开始。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const int N=1e3+10;
const int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int n,m,dp[N*N],vis[N*N],res; char s[N][N];
vector<int> g[N*N];
inline int id(int x,int y){return (x-1)*m+y;}
int dfs(int x){
	vis[x]=1;
	for(int to:g[x]){
		if(!vis[to]){
			if(dfs(to))	return 1;
		}else if(vis[to]==1) return 1;
	}
	vis[x]=2;
	return 0;
}
int DP(int x){
	if(dp[x])	return dp[x];
	for(int to:g[x]) dp[x]=max(dp[x],DP(to));
	return ++dp[x];
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)	scanf("%s",s[i]+1);
	for(int i=1;i<=n;i++)	for(int j=1;j<=m;j++){
		for(int k=0;k<4;k++){
			int tx=i+dx[k],ty=j+dy[k];
			if(tx<1||ty<1||tx>n||ty>m)	continue;
			if((s[i][j]=='D'&&s[tx][ty]=='I')||(s[i][j]=='I'&&s[tx][ty]=='M')||
			(s[i][j]=='M'&&s[tx][ty]=='A')||(s[i][j]=='A'&&s[tx][ty]=='D'))	
				g[id(i,j)].push_back(id(tx,ty));
		}
	}
	for(int i=1;i<=n*m;i++)	if(!vis[i]){
		if(dfs(i)) return puts("Poor Inna!"),0;
	}
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(s[i][j]=='D')
		res=max(res,DP(id(i,j)));
	if(res<4)	puts("Poor Dima!");
	else	cout<<res/4;
	return 0;
}

你可能感兴趣的:(Codeforces,dfs,动态规划)