1. 程式人生 > >洛谷P1434 滑雪【記憶化搜索】

洛谷P1434 滑雪【記憶化搜索】

ret typedef lane pri 現在 記錄 esp names new

題目: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 }

洛谷P1434 滑雪【記憶化搜索】