SHOI2002 滑雪:记忆化搜索(本质是动态规划)

记忆化搜索可行的关键点在于求解过程的无后效性,比如本题中要求下滑轨迹必须是连续单调下降的路径,所以高位置的解只与低位置的解有关,因此满足无后效性。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #define maxn 105
 5 using namespace std;
 6 int dx[4]={0,0,1,-1};
 7 int dy[4]={1,-1,0,0};
 8 int R,C;
 9 int h[maxn][maxn],s[maxn][maxn];
10 
11 void dfs(int x, int y){
12     if (s[x][y]) return;
13     s[x][y]=1;
14     for (int k=0; k<4; k++){
15         int tx=x+dx[k], ty=y+dy[k];
16         if (!(tx>=1 && tx<=R &&ty>=1 &&ty<=C && h[tx][ty]<h[x][y])) continue;
17         dfs(tx,ty);
18         s[x][y]=max(s[x][y],s[tx][ty]+1);
19     }
20 }
21 
22 int main(){
23     scanf("%d%d", &R, &C);
24     for (int i=1; i<=R; i++)
25         for (int j=1; j<=C; j++){
26             scanf("%d", &h[i][j]);
27             s[i][j]=0;
28         }
29     int ans=0; 
30     for (int i=1; i<=R; i++){
31         for (int j=1; j<=C; j++){
32             dfs(i,j);
33             ans=max(ans,s[i][j]);
34         }
35     }
36     printf("%d\n", ans);
37     return 0;
38 }

 

posted @ 2020-07-03 11:05  mzl0707  阅读(170)  评论(0编辑  收藏  举报