Inna and Dima CodeForces - 374C
阿新 • • 發佈:2021-08-24
原題連結
考察:記憶化搜尋
思路:
不用等完整的DIMA在記錄.設定\(dp[i][j]\)為當前座標\((i,j)\)能走的步數.求所有起點的最大\(dp[i][j]\).
無窮的條件是當前起點開始走到本次走過的地方.所以還需要一個\(bool\)陣列記錄.
Code
#include <iostream> #include <cstring> using namespace std; const int N = 1010,INF = 0x3f3f3f3f; int n,m,dp[N][N];//以x,y為起點能搜到的最大dima char s[N][N],dir[N/10] = "DIMA"; bool vis[N][N]; int xx[4] = {-1,1,0,0},yy[4] = {0,0,-1,1}; int dfs(int x,int y,int idx) { if(dp[x][y]!=-1) return dp[x][y]; dp[x][y] = 0; int ans = 0; for(int i=0;i<4;i++) { int dx = x+xx[i],dy = y+yy[i]; if(dx>0&&dx<=n&&dy>0&&dy<=m&&s[dx][dy]==dir[idx%4]) { if(vis[dx][dy]) return INF; vis[dx][dy] = 1; ans = max(dfs(dx,dy,idx+1),ans); vis[dx][dy] = 0; } } return dp[x][y] = ans+1; } void solve() { int ans = 0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(s[i][j]=='D'&&dp[i][j]==-1) { vis[i][j] = 1; ans = max(dfs(i,j,1),ans); vis[i][j] = 0; } if(ans/4==0) puts("Poor Dima!"); else if(ans>=INF) puts("Poor Inna!"); else printf("%d\n",ans/4); } int main() { scanf("%d%d",&n,&m); memset(dp,-1,sizeof dp); for(int i=1;i<=n;i++) scanf("%s",s[i]+1); solve(); return 0; }