作业帮 > 综合 > 作业

pascal 要标程小明喜欢滑雪,因为滑雪的确很刺激,可是为了获得速度,滑的区域必须向下倾斜,当小明滑到坡底,不得不再次

来源:学生作业帮 编辑:搜狗做题网作业帮 分类:综合作业 时间:2024/07/17 04:43:44
pascal 要标程
小明喜欢滑雪,因为滑雪的确很刺激,可是为了获得速度,滑的区域必须向下倾斜,当小明滑到坡底,不得不再次走上坡或等着直升机来载他,小明想知道在一个区域中最长的滑坡.滑坡的长度由滑过点的个数来计算,区域由一个二维数组给出,数组的每个数字代表点的高度.
下面是一个例子:
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-...-3-2-1更长,事实上这是最长的一条.
pascal 要标程小明喜欢滑雪,因为滑雪的确很刺激,可是为了获得速度,滑的区域必须向下倾斜,当小明滑到坡底,不得不再次
记忆化搜索,附解释,程序较短
const
dx:array[1..4] of integer=(1,-1,0,0);
dy:array[1..4] of integer=(0,0,1,-1); //这个不用我说了吧,就是4个方向
var
a,f:array[1..100,1..100] of longint;
r,c,i,j:integer;
ans:longint;
procedure work(x,y:integer);
var
i:integer;
begin
for i:=1 to 4 do
if (x+dx[i]>0) and (x+dx[i]0) and (y+dy[i]a[x,y]) and (f[x+dx[i],y+dy[i]]=1) then //这里比较恐怖,主要是判是否越界
work(x+dx[i],y+dy[i]);
if (a[x+dx[i],y+dy[i]]>a[x,y]) and (f[x,y]ans then
ans:=f[i,j];
end;
writeln(ans);
end.
这是自己编的,然后先看一下注释,运行的话把注释删点吧,就是划//以后的东西.
顺便附上在Tyvj(就是那个Vijos的替代网站,www.tyvj.cn,有兴趣你可以上去做做题目,如果已经知道了,那就当我废话吧~~~~)上的测试结果.
VijosNT Mini 2.0.5.6
#01: Accepted (0ms, 712KB)
#02: Accepted (0ms, 712KB)
#03: Accepted (0ms, 712KB)
#04: Accepted (0ms, 712KB)
#05: Accepted (0ms, 712KB)
#06: Accepted (0ms, 712KB)
#07: Accepted (0ms, 712KB)
#08: Accepted (0ms, 712KB)
#09: Accepted (43ms, 712KB)
#10: Accepted (43ms, 712KB)
Accepted / 100 / 87ms / 712KB
非常荣幸能够解答