POJ 1088 滑雪
滑雪
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 65004 | Accepted: 23795 |
题目链接: http://poj.org/problem?id=1088
不理他是不是DP的问题了,最终还是用自己熟悉的DFS解决,但隐约地感觉还是有DP的味道,因为你确认从一个点能走多远的时候,你必须先知道四周的那个点能走多远
1 #include<stdio.h> 2 #include<string.h> 3 #define MAXN 120 4 int maze[MAXN][MAXN]; 5 int visit[MAXN][MAXN], value[MAXN][MAXN]; 6 7 int dir[4][2] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}}; 8 9 int Traverse(int r, int c, int x, int y) 10 { 11 int i, j, t, temp = 1, max = 0; 12 visit[x][y] = -1; // -1 表示此时的点还在遍历当中 13 for(t=0; t<4; ++t) 14 { 15 i = x+dir[t][0]; 16 j = y+dir[t][1]; 17 if(0<=i && i<r && 0<=j && j<c && maze[i][j] < maze[x][y]) 18 {//其实对于这种题印象最深刻的还是得到一个值是建立在得到其他值的基础之上的 19 if(visit[i][j] == 0) temp = Traverse(r, c, i, j); 20 else if(visit[i][j] != -1) temp = value[i][j]; 21 max = temp > max ? temp : max; 22 } 23 } 24 visit[x][y] = 1; 25 value[x][y] = value[x][y] > max+1 ? value[x][y] : max+1; 26 return value[x][y]; 27 } 28 int main() 29 { 30 // freopen("input.txt", "r", stdin); 31 int c, r, temp, i, j; 32 scanf("%d%d", &r, &c); 33 for(i=0; i<r; ++i) 34 for(j=0; j<c; ++j) 35 scanf("%d", &maze[i][j]); 36 memset(visit, 0, sizeof(visit)); 37 memset(value, 0, sizeof(value)); //value[i][j] 表示从这个点开始能滑多久 38 for(i=0; i<r; ++i) 39 for(j=0; j<c; ++j) 40 Traverse(r, c, i, j); 41 temp = 0; 42 for(i=0; i<r; ++i) 43 for(j=0; j<c; ++j) 44 temp = temp > value[i][j] ? temp : value[i][j]; 45 printf("%d\n", temp); 46 return 0; 47 }
更多内容请关注个人微信公众号 物役记 (微信号:materialchains)
作者:雪影蓝枫
本文版权归作者和博客园共有,欢迎转载,未经作者同意须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。