Description
小明现在有 n 个不同的正整数 X1 , X2 , … Xn 排成一行。
小明每次可以将左边或右边删掉连续的若干个数(只能从两边删数)。
每次删数可以得到一个值,若删除从 i 到 j 的数( i<j ),则得到的价值为 |Xi-Xj|*
( j-i+1 )。
若只删除一个数( i=j ),则得到的价值为 Xi 。
现在小明想使得到的价值总和最大,请你帮他计算一下,这个最大值是多少?
Input
第一行一个整数 n 。
第二行 n 个整数,表示 X 。
Output
输出仅一行一个整数,表示能得到的最大价值。
Sample Input
6
54 29 196 21 133 118
Sample Output
768
DataConstraint
Hint
对于 30% 的数据满足 1 ≤ n ≤ 100 。
对于 100% 的数据满足 1 ≤ n ≤ 2,000 。
大意:把一个数列分成若干块,求最大价值。
分析:一看就是DP,不解释。设F[i]为前i个数的最大价值。
F[I]=max(f[i-1]+a[i],f[j-1]+abs(a[i]-a[j])*(i-j+1)) (1<=j<=i-1)
{把j—i看为一个区间或者把第i个数单独一个区间}
程序:
const
maxn=2000;
var
f:array [0..maxn] of longint;
a,b:array [1..maxn] of longint;
n,i,j:longint;
function max(x,y:longint):longint;
begin
if x>y then exit(x)
else exit(y);
end;
begin
readln(n);
for i:=1 to n do
read(a[i]);
f[1]:=a[1];
for i:=2 to n do
for j:=1 to i do
if i<>j then
f[i]:=max(f[i],f[j-1]+abs(a[i]-a[j])*(i-j+1))
else
f[i]:=max(f[i],f[i-1]+a[i]);
write(f[n]);
end.