`经典的dp
考虑到其实从后往前和从前往后只有第n个会有差异,就直接使用f[i][j]表示第一种到i,第二种到j的最小差值之和,又由f[i][j]可以转移到f[i][k],f[j,k],最后再在基础上加上最后一个取最大值即可
var
ans:int64;
i,j,k,n:longint;
f,s:array[0..1000,0..1000] of int64;
a:array[0..1000] of longint;
function maxx(a,b:longint):longint;
begin
if a>b then maxx:=a
else maxx:=b;
end;
function minn(a,b:int64):int64;
begin
if a<b then minn:=a
else minn:=b;
end;
begin
read(n);
for i:=1 to n do
read(a[i]);
for i:=1 to n do
for j:=1 to n do
s[i,j]:=abs(a[i]-a[j]);
for i:=0 to n do
for j:=0 to n do
f[i,j]:=maxlongint;
f[0,0]:=0;
for i:=0 to n do
for j:=0 to n do
begin
k:=maxx(i,j)+1;
f[i,k]:=minn(f[i,k],f[i,j]+s[j,k]);
f[j,k]:=minn(f[j,k],f[i,j]+s[i,k]);
end;
ans:=maxlongint;
for i:=0 to n do
begin
ans:=minn(ans,f[i,n]+s[i,n]);
end;
writeln(ans);
end.