题目链接: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 }