poj1088

这题是dp还是dfs+记忆化?(其实好像没什么区别?)

用f[i,j]表示滑到(i,j)时之后最多能滑多远,依次穷举每一个起点(i,j)则

f[i,j]=max{f[i,j-1],f[i-1,j],f[i+1,j],f[i,j+1]}+1 (当然滑到那个点的高度要小于(i,j)的高度)

 1 const dx:array[1..4] of integer=(0,0,-1,1);
 2       dy:array[1..4] of integer=(-1,1,0,0);
 3 var f,a:array[0..600,0..600] of longint;
 4     n,i,j,m,ans:longint;
 5 function max(a,b:longint):longint;
 6   begin
 7     if a>b then max:=a else max:=b;
 8   end;
 9 procedure search(x,y:longint);
10   var i,xx,yy:integer;
11       maxx:longint;
12   begin
13     maxx:=0;
14     for i:=1 to 4 do
15     begin
16       xx:=x+dx[i];
17       yy:=y+dy[i];
18       if (a[xx,yy]<a[x,y]) and (f[xx,yy]=0) then search(xx,yy);
19       if (a[xx,yy]<a[x,y]) then maxx:=max(maxx,f[xx,yy]);
20     end;
21     f[x,y]:=maxx+1;
22   end;
23 
24 begin
25   readln(n,m);
26   for i:=0 to n+1 do
27     for j:=0 to m+1 do
28       a[i,j]:=21474836;
29   for i:=1 to n do
30   begin
31     for j:=1 to m do
32       read(a[i,j]);
33     readln;
34   end;
35   for i:=1 to n  do
36     for j:=1 to m do
37       if f[i,j]=0 then search(i,j);
38   for i:=1 to n do
39     for j:=1 to m do
40       ans:=max(ans,f[i,j]);
41   writeln(ans);
42 end.
View Code
原文地址:https://www.cnblogs.com/phile/p/4473316.html