cf C. Inna and Dima

http://codeforces.com/contest/374/problem/C

记忆化搜索,题意:求按照要求可以记过名字多少次,如果次数为无穷大,输出Poor Inna!,如果不经过一次输出Poor Dima!,否则输出输出次数。

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <algorithm>

 4 #define maxn 1001

 5 #define LL __int64

 6 using namespace std;

 7 const LL inf=999999999;

 8 

 9 int n,m;

10 char g[maxn][maxn];

11 LL dp[maxn][maxn];

12 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

13 LL max1(LL a,LL b)

14 {

15     return a>b?a:b;

16 }

17 LL min1(LL a,LL b)

18 {

19     return a>b?b:a;

20 }

21 

22 LL dfs(int x,int y)

23 {

24     if(dp[x][y]!=-1) return dp[x][y];

25     dp[x][y]=inf;

26     int c=0;

27     for(int i=0; i<4; i++)

28     {

29         int xx=x+dir[i][0];

30         int yy=y+dir[i][1];

31         if(xx>=0&&xx<n&&yy>=0&&yy<m)

32         {

33             if((g[x][y]=='D'&&g[xx][yy]=='I')||(g[x][y]=='I'&&g[xx][yy]=='M')||(g[x][y]=='M'&&g[xx][yy]=='A')||(g[x][y]=='A'&&g[xx][yy]=='D'))

34             {

35                 c=max1(c,dfs(xx,yy));

36             }

37         }

38     }

39     return dp[x][y]=min1(inf,c+1);

40 }

41 int main()

42 {

43     while(scanf("%d%d",&n,&m)!=EOF)

44     {

45         memset(dp,-1,sizeof(dp));

46         for(int i=0; i<n; i++)

47         {

48             scanf("%s",g[i]);

49         }

50         LL ans=0;

51         for(int i=0; i<n; i++)

52         {

53             for(int j=0; j<m; j++)

54             {

55                 if(g[i][j]=='D')

56                 {

57                     ans=max1(ans,dfs(i,j));

58                 }

59             }

60         }

61         if(ans==inf)

62         {

63             printf("Poor Inna!\n");

64         }

65         else

66         {

67             LL y=ans/4;

68             if(y==0)

69             {

70                 printf("Poor Dima!\n");

71             }

72             else

73                 printf("%I64d\n",y);

74         }

75     }

76     return 0;

77 }
View Code

 

你可能感兴趣的:(DI)