G:jlz的漫步(1316)

题目链接:http://acm.xidian.edu.cn/problem.php?id=1316

  dfs + 记忆化搜索,因为dfs的回溯,很方便的可以在每一点做记忆;

  dfs定义变量一定要注意全局和局部;

 1 #include<stdio.h>
 2 #include<memory.h>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 int A[1005][1005];
 7 int d[1001][1001];
 8 int n, m; 
 9 int max_len;
10 int dx[4] = {-1, 0, 1, 0};
11 int dy[4] = {0, -1, 0, 1};
12 
13 int dfs(int x, int y)
14 {
15     if(d[x][y] != 0)                //判断是否有子树已经被经历过 
16         return d[x][y];
17     int len = 1;                     //**********dfs中的量,尽可能都在dfs中定义,因为该量会随dfs递归和回溯,定义为全局变量会出事(1h血的教训!!!) 
18     for(int k = 0;k < 4;k++)
19     {
20         int di = x + dx[k];
21         int dj = y + dy[k];
22         if(di >= 0 && di < n && dj >= 0 && dj < m && A[di][dj] > A[x][y])
23         {
24             len = max(len, dfs(di,dj) + 1);
25         }
26     }
27      d[x][y] = len;                        //通过回溯来实现倒着记录层数(语言匮乏,你可以试着用bfs想一下,发现bfs很难做到) 
28      return len; 
29 }
30 
31 int main()
32 {
33     int T;
34     while(scanf("%d",&T) != EOF)
35     {
36         while(T--)
37         {
38             memset(d,0,sizeof(d));
39             max_len = -1;
40             scanf("%d %d",&n, &m);            
41             for(int i = 0;i < n;i++)
42                 for(int j = 0;j < m;j++)
43                     scanf("%d",&A[i][j]);
44             for(int i = 0;i < n;i++)
45                 for(int j = 0;j < m;j++)
46                 {
47                      max_len = max(max_len,dfs(i,j));        //在各个点执行dfs,找出最长路径 
48                 }
49             printf("%d\n",max_len);
50         }
51     }
52     return 0;
53 } 

 

posted @ 2018-05-31 00:56  Dicer  阅读(195)  评论(0编辑  收藏  举报