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 }