这次,OI山成为了雷曼兔那无尽的冒险传说的新舞台!传说OI山中埋藏着巨大的宝藏,伴随着这个传说的是一个迷题:最瑰丽的舞者将达至精灵世界的彼岸……
经过仔细推敲,雷曼兔发现这是一个提示宝藏埋藏位置的谜语,在该谜语中指出了一个特定的路径,只有经过了该路径宝藏才会出现,具体情况如下:
OI山的地势图可以看作一个N*N的数字矩阵,由1-N^2的数字组成(每个数字出现且仅出现一次),这些数字表示每个地点的地势高低。雷曼兔的出发点在最高的山顶处,并且每次雷曼兔可以从其当前所在的位置跳跃到任何一个比当前地点高度低的位置,假设雷曼兔该次跳跃从坐标(x1,y1)跳到了坐标(x2,y2),则这次跳跃的华丽度定义为v=(|x1-x2|+|y1-y2|)^2。而开启宝藏秘密的路径就是从山顶不断跳跃直到山底(高度最低点)的华丽度总和最高的路径,而现在我们想要知道的是这个最高的华丽度总和是多少
input:
第一行包括一个整数n(n<=50)表示地图的长宽。
接下来n行每行包括n个数表示每个地点的高度。
output:
输出包括一个整数ans,表示从山顶到山底最高华丽度总和
input:
2
3 1
2 4
output:
9
【参考程序】:
type node=record
x,y,s:longint;
end;
var a:array[1..2500]of node;
f:array[1..2500]of longint;
n,i,j,k,max,sum:longint;
function jisuan(x1,y1,x2,y2:longint):longint;
begin
jisuan:=sqr(abs(x1-x2)+abs(y1-y2));
end;
procedure qsort(s,t:longint);
var i,j,mid:longint;
tt:node;
begin
i:=s;j:=t;mid:=a[(s+t) div 2].s;
while i<=j do
begin
while a[i].s<mid do inc(i);
while a[j].s>mid do dec(j);
if i<=j then
begin
tt:=a[i];a[i]:=a[j];a[j]:=tt;
inc(i);dec(j);
end;
end;
if i<t then qsort(i,t);
if s<j then qsort(s,j);
end;
begin
//while not eof do
//begin
read(n);
k:=0;
for i:=1 to n do
for j:=1 to n do
begin
inc(k);
a[k].x:=i;
a[k].y:=j;
read(a[k].s);
end;
qsort(1,k);
fillchar(f,sizeof(f),0);
for i:=k-1 downto 1 do
for j:=i+1 to k do
if a[i].s<a[j].s then
begin
sum:=jisuan(a[i].x,a[i].y,a[j].x,a[j].y);
if f[i]<f[j]+sum then
f[i]:=f[j]+sum;
end;
max:=0;
for i:=1 to k do
if f[i]>max then
max:=f[i];
writeln(max);
//end;
end.