POJ 1088 滑雪 (记忆化搜索)

题目链接:http://poj.org/problem?id=1088

题意很好懂,就是让你求一个最长下降路线的长度。

dp[i][j]记录的是i j这个位置的最优的长度,然后转移方程是dp[i][j] = max(dp[i][j - 1], dp[i - 1][j], dp[i][j + 1], dp[i + 1][j]) + 1。

已知最低点的答案 慢慢倒推到高点的答案。(还是对记忆化搜不熟练啊)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int MAXN = 105;
 6 int dp[MAXN][MAXN] , r , c , h[MAXN][MAXN] , cont;
 7 int tx[] = {-1 , 0 , 1 , 0} , ty[] = {0 , -1 , 0 , 1};
 8 
 9 int dfs(int x , int y) {
10     if(dp[x][y]) 
11         return dp[x][y];
12     for(int i = 0 ; i < 4 ; i++) {
13         int xx = x + tx[i] , yy = y + ty[i];
14         if(xx < 1 || yy < 1 || xx > r || yy > c || h[xx][yy] >= h[x][y]) {
15             continue;
16         }
17         dp[x][y] = max(dfs(xx , yy) , dp[x][y]);
18     }
19     return (++dp[x][y]);
20 }
21 
22 int main()
23 {
24     while(~scanf("%d %d" , &r , &c)) {
25          cont = 0;
26          memset(dp , 0 , sizeof(dp));
27          for(int i = 1 ; i <= r ; i++) {
28              for(int j = 1 ; j <= c ; j++) {
29                  scanf("%d" , &h[i][j]);
30              }
31          }
32          for(int i = 1 ; i <= r ; i++) {
33              for(int j = 1 ; j <= c ; j++) {
34                  cont = max(cont , dfs(i , j));
35              }
36          }
37          printf("%d\n" , cont);
38     }
39 }

 

posted @ 2016-04-20 11:10  Recoder  阅读(157)  评论(0编辑  收藏  举报