第一个 记忆化搜索版的 90分
测试结果10: 运行错误|栈溢出
dy:array[1..4]of shortint=(1,-1,0,0);
var
i,j,r,c:integer;
t,ans:longint;
a:array[1..100,1..100]of word;
f:array[1..100,1..100]of word;
function search(x,y:shortint):word;
var
i,nx,ny:shortint; t,temp:longint;
begin
if f[x,y]>0 then begin search:=f[x,y]; exit; end;
t:=1;
for i:=1to 4 do
begin
nx:=x+dx[i];
ny:=y+dy[i];
if (nx>=1)and(nx<=r)and(ny>=1)and(ny<=c)and(a[x,y]<a[nx,ny])
then begin
temp:=1+search(nx,ny);
if temp>t then t:=temp;
end;
end;
f[x,y]:=t;
search:=t;
end;
begin
readln(r,c);
for i:=1to r do
for j:=1to c do
read(a[i,j]);
ans:=0;
for i:=1to r do
for j:=1to c do
begin
t:=search(i,j);
f[i,j]:=t;
if t>ans then ans:=t;
end;
writeln(ans);
end.
第二个 先排序的 60分
测试结果1:测试结果错误.错误结果为:6
正确结果应为:7
测试结果7:测试结果错误.错误结果为:2
正确结果应为:3
测试结果8:测试结果错误.错误结果为:4
正确结果应为:5
测试结果9: 测试结果错误.错误结果为:9
正确结果应为:10
program zz;
const
dx:array[1..4]of shortint=(1,-1,0,0);
dy:array[1..4]of shortint=(0,0,1,-1);
type
point=record
gao,cross,down:integer;
end;
var
i,j,m,n,max,t,x,y:longint;
f,a:array[1..100,1..100]of integer;
b:array[1..10000]of point;
procedure sort(l,r:integer);
var
i,j,x:integer;
y:point;
begin
i:=l; j:=r;
x:=b[(l+r)div 2].gao;
repeat
while b[i].gao<x do inc(i);
while b[j].gao>x do dec(j);
if i<=j then
begin
y:=b[i];
b[i]:=b[j];
b[j]:=y;
inc(i);
dec(j);
end;
until i>j;
if i<r then sort(i,r);
if j>l then sort(l,j);
end;
begin
read(m,n);
for i:=1to m do
for j:=1to n do
begin
inc(t);
read(a[i,j]);
b[t].gao:=a[i,j];
b[t].cross:=i;
b[t].down:=j;
end;
sort(1,t);
f[b[t].cross,b[t].down]:=1;
for i:=m*n downto 1 do
begin
for j:=1to 4 do
if a[b[i].cross,b[i].down]>a[b[i].cross+dx[j],b[i].down+dy[j]] then
begin
x:=b[i].cross+dx[j];
y:=b[i].down+dy[j];
if (f[b[i].cross,b[i].down]+1>f[x,y])and(x>=1)and(x<=m)
and(y>=1)and(y<=n)
then f[x,y]:=f[b[i].cross,b[i].down]+1;
end;
end;
for i:=1to m do
for j:=1to n do
if f[i,j]>max then max:=f[i,j];
writeln(max);
readln(i);
end.