这题是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.