P1434 滑雪

P1434 滑雪

题目描述

Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子:

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(从24开始,在1结束)。当然25-24-23―┅―3―2―1更长。事实上,这是最长的一条。

输入输出格式

输入格式:

输入的第一行为表示区域的二维数组的行数R和列数C(1≤R,C≤100)。下面是R行,每行有C个数,代表高度(两个数字之间用1个空格间隔)。

输出格式:

输出区域中最长滑坡的长度。

输入输出样例

输入样例#1:
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
输出样例#1:
25
记忆化搜索,为什么能用记忆化搜索呢?
首先我们在搜索每个点的最长路径时,可能有这种情况,第一条路径搜到了(x0,y0)这个点,然后dfs(x0,y0);这样就搜出了从(x0,y0)出发的最长路径,那么如果
我们在搜第二条路径时或者搜从(x0,y0)出发的最长路径时,这次搜到的最长路径和第一次是一样的,所以我们可以用记忆化搜索。
 1 #include<cstdio>
 2 #include<algorithm>
 3 
 4 using namespace std ;
 5 const int MAXN = 110;
 6 int h[MAXN][MAXN];
 7 int f[MAXN][MAXN];
 8 int dx[4] = {0,0,1,-1};
 9 int dy[4] = {1,-1,0,0};
10 bool v[MAXN][MAXN];
11 int n,m,p,ans;
12 
13 void dfs(int x,int y,int cnt)
14 {
15     if (cnt>ans) ans = cnt;
16     for (int i=0; i<4; ++i)
17     {
18         int xx = dx[i]+x;
19         int yy = dy[i]+y;
20         if (h[x][y]>h[xx][yy] && xx>0 && yy>0 && xx<=n && yy<=m && !v[xx][yy])
21         {
22             dfs(xx,yy,cnt+1);
23         }
24     }
25 }
26 int dfs(int x,int y)
27 {
28     for(int i=0; i<=3; i++)
29     {
30         int xx = dx[i]+x;
31         int yy = dy[i]+y;
32         if(xx>=1&&yy>=1&&xx<=n&&yy<=m)//判断是否出边界
33         {
34             if(h[x][y]>h[xx][yy])//判断是否小
35             {
36                 if(f[xx][yy]!=1) f[x][y]=max(f[xx][yy]+1,f[x][y]);//如果搜过了,就直接调用
37                 else f[x][y]=max(dfs(xx,yy)+1,f[x][y]);//没搜过就搜
38             }
39         }
40     }
41     return f[x][y];//返回值
42 }
43 int main()
44 {
45     scanf("%d%d",&n,&m);
46     for (int i=1; i<=n; ++i)
47         for (int j=1; j<=m; ++j)
48         {
49             scanf("%d",&h[i][j]);
50             f[i][j] = 1;
51         }
52     for (int i=1; i<=n; ++i)
53         for (int j=1; j<=m; ++j)
54         {
55             int sum = dfs(i,j);
56             ans = max(sum,ans);
57         }
58     printf("%d",ans);
59     return 0;
60 }
原文地址:https://www.cnblogs.com/mjtcn/p/7100776.html