P1434 滑雪
Posted HWIM
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 滑雪的主要内容,如果未能解决你的问题,请参考以下文章