滑雪 记忆化搜索简单模型

滑雪是一项非常刺激的运动,为了获得速度,滑雪的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。给出一个由二维数组表示的滑雪区域,数组的数字代表各点的高度。请你找出这个区域中最长的滑坡。

下面是一个例子:

1  2  3  4  5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然,25-24-23-...-3-2-1更长。事实上,这是最长的一条滑坡。

【输入文件】

输入文件ski.in的第一行为两个数R, C,表示滑雪区域的行数和列数(1≤R,C≤100)。下面是R行,每行有C个整数,表示高度H(0≤H≤10000)。

【输出文件】

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 using namespace std;
 5 int m,n;
 6 int map[1000][1000];
 7 int book[1000][1000];
 8 int nextx[4]={1,-1,0,0};
 9 int nexty[4]={0,0,1,-1};
10 int ans=-1;
11 void ins(){
12     scanf("%d%d",&n,&m);
13     for(int i=1;i<=n;i++){
14         for(int j=1;j<=m;j++){
15             scanf("%d",&map[i][j]);
16         }
17     }
18 }
19 int dfs(int x,int y){
20     if(book[x][y]!=0){
21         return book[x][y];
22     }
23     for(int i=0;i<=3;i++){
24         int tx=x+nextx[i];
25         int ty=y+nexty[i];
26         if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&map[x][y]>map[tx][ty]){
27             book[x][y]=max(book[x][y],dfs(tx,ty)+1);
28         }
29     }
30     return book[x][y];
31 }
32 int main(){
33     freopen("ski.in","r",stdin);
34     freopen("ski.out","w",stdout);
35     ins();
36     for(int i=1;i<=n;i++){
37         for(int j=1;j<=m;j++){
38             ans=max(ans,dfs(i,j)+1);
39         }
40     }
41     cout<<ans;
42 }

输出文件ski.out包括一行,只包含一个整数,表示滑雪区域中最长滑坡的长度。

【样例输入】

5 5

1 2 3 4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

【样例输出】

25

原文地址:https://www.cnblogs.com/1129-tangqiyuan/p/8488159.html