[Code Vs 2152]滑雪

滑雪

时间限制: 1 Sec 内存限制: 128 MB

题目描述

小明喜欢滑雪,因为滑雪的确很刺激,可是为了获得速度,滑的区域必须向下倾斜,当小明滑到坡底,不得不再次走上坡或等着直升机来载他,小明想知道在一个区域中最长的滑坡。滑坡的长度由滑过点的个数来计算,区域由一个二位数组给出。数组的每个数字代表点的高度。下面是一个例子:

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 24 17 16 1(从25开始到1结束),当然25 24 23 22… 2 1更长,事实上是最长的一条。

输入

第一行为表示区域的数组的行数R和列数C( 1 <= R ,C <= 100)
下面是R行,每行有C个数代表高度(不超过10000)。

输出

区域中最长的滑坡长度。

样例输入

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

题解

4个方向扫2(N,M)max

var
 x,y,dp,w:array[-1..100,-1..100]of longint;
 i,j,k:longint;
 n,m,ans,tt:longint;
function max(a,b:longint):longint;
begin
 if a>b
 then exit(a)
 else exit(b);
end;

procedure work;
var i,j:longint;
begin
 for i:=1 to n do
  for j:=1 to m do
    if w[i,j]>w[i-1,j]
    then x[i,j]:=max(x[i,j],x[i-1,j]+1);
 for i:=1 to n do
  for j:=m downto 1 do
    if w[i,j]>w[i+1,j]
    then x[i,j]:=max(x[i,j],x[i+1,j]+1);
 for i:=1 to n do
  for j:=1 to m do
    if w[i,j]>w[i,j-1]
    then x[i,j]:=max(x[i,j],x[i,j-1]+1);
 for i:=1 to n do
  for j:=m downto 1 do
    if w[i,j]>w[i,j+1]
    then x[i,j]:=max(x[i,j],x[i,j+1]+1);
end;

begin
 readln(n,m);
 for i:=1 to n do
  begin
   for j:=1 to m do
    read(w[i,j]);
   readln;
  end;
 for i:=1 to n do
  for j:=1 to m do
    x[i,j]:=1;
 tt:=max(n,m);
 for i:=1 to 2*tt do
  work;
 for i:=1 to n do
  for j:=1 to m do
   ans:=max(ans,x[i,j]);
 writeln(ans);
end.
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/slongle_amazing/article/details/46839461
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭