Problem 1 活蹦乱跳的香穗子
香穗子在田野上调蘑菇!她跳啊跳,发现自己很无聊,于是她想了一个有趣的事情,每个格子最多只能经过1次,且每个格子都有其价值
跳的规则是这样的,香穗子可以向上下左右四个方向跳到相邻的格子,并且她只能往价值更高(这里是严格的大于)的格子跳.
香穗子可以从任意的格子出发,在任意的格子结束,
那么她最多能跳几次?
输入:
第一行n,m,表示田野的长和宽
接下来n行,每行m个数,表示该格的价值
输出:
一个数,表示最多跳得次数
Sample Input
2 2
2 5
-1 3
Sample Output
3
数据范围:
n,m<=100
答案保正小于Maxlongint
思路:目测和滑雪一样,最长上升子序列升级版,显然,每个点的值由周围四个点可以推出,易得方程:f[I,j]=max{f[i-1,j],f[i+1,j],f[I,j-1],f[I,j+1]}+1 (map[I,j]<map[I’,j’]),由于找不到递推顺序,所以用记忆化搜索的方式求解,对每个点进行一次搜索,输出最大值即可
提交情况:显然1次AC
经验:不要尝试去找这种类型的方程的递推顺序= =
收获:同上
ACCode:
Program one;
Const
xc:array[1..4]oflongint=(0,1,0,-1);
yc:array[1..4]oflongint=(1,0,-1,0);
Var
n,m,max:longint;
map,f:array[0..150,0..150]oflongint;
Procedure init;
var
i,j:longint;
begin
assign(input,'1.in');
assign(output,'1.out');
reset(input);
rewrite(output);
readln(n,m);
fori:=1 to n do
forj:=1 to m do
read(map[i,j]);
end;
Procedure terminate;
begin
close(input);
close(output);
halt;
end;
Function dp(x,y:longint):longint;
var
i,t:longint;
begin
iff[x,y]<>0 then exit(f[x,y]);
fori:=1 to 4 do
begin
if(x+xc[i]<0)or(x+xc[i]