pascal 小明喜欢滑雪,因为滑雪的确很刺激,可是为了获得速度,滑的区域必须向下倾斜,当小明滑到坡底,不得不再次走上坡或等着直升机来载他,小明想知道在一个区域中最长的滑坡.滑坡的长度

来源:学生作业帮助网 编辑:作业帮 时间:2024/11/15 11:54:29

pascal 小明喜欢滑雪,因为滑雪的确很刺激,可是为了获得速度,滑的区域必须向下倾斜,当小明滑到坡底,不得不再次走上坡或等着直升机来载他,小明想知道在一个区域中最长的滑坡.滑坡的长度
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,0,0,1);
dy:array[1..4]of integer=(0,1,-1,0);
var
i,j,r,c:integer;
max,num,max1:int64;
a:array[1..500,1..500]of integer;
b:array[1..500,1..500]of int64;
procedure ccf(x,y:longint);
var i:integer;
begin
if num>max then max:=num;
if num>max1 then max1:=num;
for i:=1 to 4 do
if(x+dx[i]>0)and(x+dx[i]0)and(y+dy[i]max1 then max1:=num; num:=num-b[x+dx[i],y+dy[i]]; end;
end;
begin
read(r,c);
fillchar(b,sizeof(b),0);
for i:=1 to r do
for j:=1 to c do read(a[i,j]);
max:=0;
num:=1;
for i:=1 to r do
for j:=1 to c do begin max1:=1; ccf(i,j); b[i,j]:=max1; end;
writeln(max);
end.
不要直接告诉我标程,我想知道我的错在哪里
我也是记忆化搜索啊,数据得不到,真想知道哪里有错
不是超时,是答案错误……

pascal 小明喜欢滑雪,因为滑雪的确很刺激,可是为了获得速度,滑的区域必须向下倾斜,当小明滑到坡底,不得不再次走上坡或等着直升机来载他,小明想知道在一个区域中最长的滑坡.滑坡的长度
你把a数组数据范围改成longint,我估计是超界了
你的程序最大问题就是时间复杂度,由于递归的重复子树问题,所以降低了算法的效率,请你认真看完下面的建议,我是真心想帮助你,我也只是个学这个的学生.
嗯,动规上面几位也有了,给你一个简单的模式化DP实现方式,不懂的话可以下来继续探讨.
记忆化搜索解决此题.
优势:1.模式固定,一旦掌握,必是利器.
2.无需复杂的拓扑序,也不需要寻找状态间的递推关系,直接ac.
程序及讲
program ski;
const dx:array[1..4] of -1..1=(0,1,-1,0); //枚举上下左右的四种移动
dy:array[1..4] of -1..1=(1,0,0,-1);
var a:array[0..101,0..101] of longint;
f:array[1..100,1..100] of longint; //实现记忆化,记录已经求过的点
max,r,c,i,j,t:longint;
function best(i,j:longint):longint;//记忆化搜索
var k,x,y:longint;
begin
if f[i,j]-1 then exit(f[i,j]);//如果此点已求过,则直接返回

for k:=1 to 4 do begin
x:=i+dx[k];
y:=j+dy[k];
if (a[i,j]f[x,y]) then
f[x,y]:=f[i,j]+1;
end;
exit(f[i,j]);
end;
begin
assign(input,'ski.in');reset(input);
assign(output,'ski.out'); rewrite(output);
readln(r,c);
fillchar(a,sizeof(a),$ff); //给a赋极大值,设置边界
for i:=1 to r do
for j:=1 to c do
read(a[i,j]);
max:=0;
for i:=1 to r do
for j:=1 to c do begin
t:=best(i,j);
if max