关闭

[Code Vs 2152]滑雪

224人阅读 评论(0) 收藏 举报
分类:

滑雪

时间限制: 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.
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:113834次
    • 积分:4425
    • 等级:
    • 排名:第6707名
    • 原创:336篇
    • 转载:0篇
    • 译文:0篇
    • 评论:21条
    文章分类
    最新评论