洛谷P1434 滑雪【记忆化搜索】

题目https://www.luogu.org/problemnew/show/P1434

题意:

给一个矩阵,矩阵中的数字代表海拔高度。

现在要找一条最长路径,使得路径上的海拔是递减的。

思路:

如果从点(i,j)出发的最长递减路径已知(假设是s),那么如果从点(x,y)可以到达点(i,j),路径s一定也包含在从点(x,y)出发的最长递减路径中。

因此我们用一个数组记录从某一点开始的最长递减路径的长度,进行搜索。

如果搜索到某一点已经有解就不继续搜索而是直接返回答案。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<map>
 4 #include<set>
 5 #include<iostream>
 6 #include<cstring>
 7 #include<algorithm>
 8 #include<vector>
 9 #include<queue>
10 
11 using namespace std;
12 typedef long long LL;
13 typedef pair<int, int> pr;
14 
15 int r, c;
16 int height[105][105];
17 int lane[105][105]; 
18 int dx[4] = {1, -1, 0, 0};
19 int dy[4] = {0, 0, -1, 1};
20 
21 bool check(int x, int y)
22 {
23     return (x > 0 && x <= r && y > 0 && y <= c);
24 }
25 
26 void dfs(int i, int j)
27 {
28     int ans = 1;
29     if(lane[i][j])return;
30     for(int k = 0; k < 4; k++){
31         int x = i + dx[k];
32         int y = j + dy[k];
33         if(check(x, y) && height[x][y] < height[i][j]){
34             if(!lane[x][y]){
35                 dfs(x, y);
36             }
37             ans = max(ans, lane[x][y] + 1);
38         }
39     }
40     lane[i][j] = ans;
41     return ;
42 }
43 
44 int main()
45 {
46     scanf("%d%d", &r, &c);
47     for(int i = 1; i <= r; i++){
48         for(int j = 1; j <= c; j++){
49             scanf("%d", &height[i][j]);
50         }
51     }
52     
53     int ans = 0;
54     for(int i = 1; i <= r; i++){
55         for(int j = 1; j <= c; j++){
56             dfs(i, j);
57             ans = max(ans, lane[i][j]);
58         }
59     }
60     printf("%d\n", ans);
61     return 0;
62 }

 

posted @ 2019-02-08 14:21  wyboooo  阅读(510)  评论(0编辑  收藏  举报