Description
小明现在有 n 个不同的正整数 X1 , X2 , … Xn 排成一行。
小明每可以将左边或右边删掉连续的若干个数(只能从两边删数 ) 。
每次删数可以得到一个值,若删除从 i 到 j 的数,则得到的价值为 |Xi-Xj|*( j-i+1 ) 。
若只删除一个数( i=j ) ,则得到的价值为 Xi 。
现在小明想使得到的价值总和最大,请你帮他计算一下,这个最大值是多少?
Input
第一行一个整数 n 。
第二行 n 个整数,表示 X 。
Output
输出仅一行一个整数,表示能得到的最大价值。
分析
在自己苦思冥想了半个小时后,我决定——————
去看一看大神的题解。
大神告诉我,从左删和从右删其实都是一样的,都是将这个序列分成X份使得所有份的和最大,这是一个dp,可以用一位表示。
于是我先推了一个
f[i]=max(f[i−1]+a[i],f[i−1]−w+abs(a[t]−a[i])∗(i−t+1))
不用在意其中的奇怪的的变量,因为他们没用!!!
错了后想了一想,发现最后一份的开头要枚举,所以————
f[i]=max(f[i],f[j−1]+abs(a[j]−a[i])∗(i−j+1))
其中j为枚举最后一份的开头,要特判一下一个一份的情况
代码
var
n:longint;
w, t:longint;
i,j,k:longint;
a:array[0..5000] of longint;
f:array[0..5000] of longint;
begin
readln(n);
for i:=1 to n do
read(a[i]);
w:=a[1];
f[1]:=a[1];
t:=1;
for i:=2 to n do
begin
for j:=1 to i-1 do
if f[i]<f[j-1]+abs(a[j]-a[i])*(i-j+1)
then
f[i]:=f[j-1]+abs(a[j]-a[i])*(i-j+1);
if f[i-1]+a[i]>f[i]
then f[i]:=f[i-1]+a[i];
end;
write(f[n]);
end.