洛谷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 }