POJ1088 (滑雪)做题笔记

·· / ·– ·· ·-·· ·-·· / ·–· · ·-· ··· ·· ··· - / ··- -· - ·· ·-·· / ·· / ·– ·· -·

这题是记忆化搜索。
因为高度的缘故所有走过的路一定不会再走一次,可以判断从每个点所能走的最远距离和已走路程是无关的,因而对于每一个点可以递归查询垓点可以走到的最远距离,在回溯前记录当前点能走到的最远距离即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
const int dx[4]={-1,0,1,0};
const int dy[4]={0,1,0,-1};
int map[101][101];
int mdis[101][101];
int n,m;
int dfs(int x,int y) {
int ans=0;
if (mdis[x][y]) return mdis[x][y];
for (int i=0;i<4;i++) {
if (x+dx[i]>=0&&x+dx[i]<n&&y+dy[i]>=0&&y+dy[i]<m
&&map[x][y]>map[x+dx[i]][y+dy[i]]) {
ans=std::max(ans,dfs(x+dx[i],y+dy[i]));
}
}
mdis[x][y]=ans+1;
return mdis[x][y];
}
int main() {
int x=0,ans=0;
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
scanf("%d",&map[i][j]);
for (int i=0;i<n;i++)
for (int j=0;j<m;j++) {
x=dfs(i,j);
ans=std::max(x,ans);
}
printf("%d",ans);
}