刪數 (Standard IO)

Description

小明现在有n个不同的正整数 X1,X2,…Xn排成一行。
小明每次可以将左边或右边删掉连续的若干个数(只能从两边删数)。
每次删数可以得到一个值,若删除从i到j的数(i<j),则得到的价值为|Xi-Xj|*(j-i+1)。
若只删除一个数(i=j),则得到的价值为Xi。
现在小明想使得到的价值总和最大,请你帮他计算一下,这个最大值是多少?

Input

第一行一个整数n。
第二行n个整数,表示X。

Output

 

输出仅一行一个整数,表示能得到的最大价值。

 

题解

 

大家要的公式:

f[i]=max(f[i],f[j−1]+abs(a[j]−a[i])∗(i−j+1))

 

代码

 

var
  n:longint;
  a,f:array[0..5001] of longint;
procedure init;
var
  i:longint;
begin
  readln(n);
  for i:=1 to n do
    read(a[i]);
end;

procedure main;
var
  i,j:longint;
begin
  f[1]:=a[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;
end;

begin
  init;
  main;
  write(f[n]);
end.



posted @ 2016-08-12 20:21  猪都哭了  阅读(194)  评论(0)    收藏  举报