搜索题 P1434 [SHOI2002]滑雪 洛谷 简单

题目描述
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
解题思路:思路就是用递归,一直求到最小的路径,然后依次求出其他的路径,若有两个答案就判断一下哪一个路径更长,最后输出最长路径。

#include<cstdio>
#include <iostream>
#include<cstring>
using namespace std;
int x[107][107]; 
int y[107][107]={0};
int a,b;
int max(int i,int j)
{
	if(i>=j)
	{
		return i;
	}
	else
	{
		return j;
	}
}
int xun(int e,int d)
{
	if(y[e][d]!=0)
	{
		return y[e][d];
	}
	else
	{
		if(e!=0&&x[e-1][d]<x[e][d])
		{
			y[e][d]=max(y[e][d],1+xun(e-1,d));
		}
		if(e!=a-1&&x[e+1][d]<x[e][d])
		{
			y[e][d]=max(y[e][d],1+xun(e+1,d));
		}
		if(d!=0&&x[e][d-1]<x[e][d])
		{
			y[e][d]=max(y[e][d],1+xun(e,d-1));
		}
		if(d!=b-1&&x[e][d+1]<x[e][d])
		{
			y[e][d]=max(y[e][d],1+xun(e,d+1));
		}
		if(y[e][d]==0)
		{
			return y[e][d]=1;
		}
		return y[e][d];
	}
} 
int bianli()
{
	int ma=0;
	for(int e=0;e<a;e++)
	{
		for(int d=0;d<b;d++)
		{
			int k=xun(e,d);
			if(k>ma)
			{
				ma=k;
			}
		}
	}
	return ma;
}
int main()
{
	cin>>a>>b;
	for(int e=0;e<a;e++)
	{
		for(int d=0;d<b;d++)
		{
			cin>>x[e][d];
		}
	}
	int ma=bianli();
	cout<<ma<<endl;
	return 0;
}

制作人:王天硕

猜你喜欢

转载自blog.csdn.net/weixin_43805821/article/details/85015529