讨论 / 帮忙看看什么地方有问题....
f(x) 2009-06-10 06:26:00
点我顶贴 收藏 删除

老是过不了 ...

program sking;

var a,f:array[0..200,0..200] of longint ;

q,w:array[0..10] of longint;

i,j,k,m,n,x,y,z,s,t:longint;

function max(a,b:longint):longint;

begin

max:=a;

if a< b then

max:=b;

end;

function find(x,y:longint):longint;

var i,j,k,l,z,s,t,m,n:longint;

begin

if f[x,y]>0 then exit(f[x,y]);

for i:= 1 to 4 do

if (a[x+q[i],y+w[i]]<a[x,y])and(x+q[i]>0)and(x+q[i]<=m)and(y+w[i]>0)and(y+w[i]<=n) then

begin

t:= find(x+q[i],y+w[i])+1;

f[x,y]:=max(f[x,y],t);

end;

f[x,y]:=max(f[x,y],1);

find:=f[x,y];

end;

begin

read(m,n);

for i:=1 to m do

for j:= 1 to n do

f[i,j]:=0;

for i:=1 to m do

for j:= 1 to n do

read(a[i,j]);

q[1]:=1;

q[2]:=0;

q[3]:=0;

q[4]:=-1;

w[1]:=0;

w[2]:=-1;

w[3]:=1;

w[4]:=0;

for i:=1 to m do

for j:= 1 to n do

f[i,j]:=find(i,j);

for i:= 1 to m do

for j:=1 to n do

z:= max(z,f[i,j]);

write(z);

end.

#1 hades@2009-06-10 05:57:00
回复 删除
f数组起始值应该为1.
#2 hades@2009-06-10 05:59:00
回复 删除
对不起,说错了……

#3 f(x)@2009-06-10 06:02:00
回复 删除
汗~~

还以为你答对了...

#4 hades@2009-06-10 06:06:00
回复 删除
Sorry,我这可不是骗分。顺便把我的程序晾一下,实在看不出有什么区别。

program hudsad;

const

dx:array[1..4] of integer=(-1,0,1,0);

dy:array[1..4] of integer=(0,1,0,-1);

var

map,f:array[1..100,1..100] of longint;

i,j,k,m,n,c,l,t,ans:longint;

function find(x,y:longint):longint;

var

i,j,k,t,nx,ny:longint;

begin

j:=1;

if f[x,y]>0 then begin find:=f[x,y];exit;end;

for i:=1 to 4 do

begin

nx:=x+dx[i];

ny:=y+dy[i];

if (nx>=1)and(nx<=n)and(ny>=1)and(ny<=c)and(map[x,y]<map[nx,ny])then

begin

t:=find(nx,ny)+1;

if t>j then j:=t;

end;

end;

f[x,y]:=j;

find:=j;

end;

begin

readln(n,c);

for i:=1 to n do

for j:=1 to c do

read(map[i,j]);

for i:=1 to n do

for j:=1 to c do begin

t:=find(i,j);

f[i,j]:=t;

if t>ans then ans:=t;

end;

writeln(ans);

end.

#5 f(x)@2009-06-10 06:08:00
回复 删除
我研究下...

还是谢谢 大牛!

#6 f(x)@2009-06-10 06:11:00
回复 删除
希望大牛讲解下 程序中的..

for i:=1 to n do

for j:=1 to c do begin

t:=find(i,j);

f[i,j]:=t;

if t>ans then ans:=t;

end;

为什么 中间要用t来过渡??

#7 hades@2009-06-10 06:24:00
回复 删除
因为如果一直用F[I,J]的话,程序需要调用内存的,(每读数组下标都需要调用内存的),用个T过度,就是想节约点时间,(讲的不是很正规,但是这个意思),也算一个小技巧吧,如果需要多次调用一个数组的值,可以用变量来节约时间的。
#8 f(x)@2009-06-10 06:26:00
回复 删除
谢谢大牛!
查看更多回复
提交回复