码迷,mamicode.com
首页 > 其他好文 > 详细

P1434 滑雪

时间:2017-07-01 00:00:16      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:strong   结束   style   一个人   size   ace   hold   else   include   

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
记忆化搜索
 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 }

P1434 滑雪

标签:strong   结束   style   一个人   size   ace   hold   else   include   

原文地址:http://www.cnblogs.com/mjtcn/p/7100776.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!