Problem:
Score : 500 points

Problem Statement

There are N children standing in a line from left to right. The activeness of the i-th child from the left is A_i.

You can rearrange these children just one time in any order you like.

When a child who originally occupies the x-th position from the left in the line moves to the y-th position from the left, that child earns A_x \times |x-y| happiness points.

Find the maximum total happiness points the children can earn.

Constraints

2 \leq N \leq 2000

1 \leq A_i \leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

Print the maximum total happiness points the children can earn.

Sample Input 1

4
1 3 4 2

Sample Output 1

20

If we move the 1-st child from the left to the 3-rd position from the left, the 2-nd child to the 4-th position, the 3-rd child to the 1-st position, and the 4-th child to the 2-nd position, the children earns 1 \times |1-3|+3 \times |2-4|+4 \times |3-1|+2 \times |4-2|=20 happiness points in total.

Sample Input 2

6
5 5 6 1 1 1

Sample Output 2

58

Sample Input 3

6
8 6 9 1 2 1

Sample Output 3

85

Solution in Rust (1.42.0) (judge verdict: Accepted)

use std::cmp;
use std::io::{stdin, Read};

macro_rules! parse {
    ($it: ident ) => {};
    ($it: ident, ) => {};
    ($it: ident, $var:ident : $tr:tt $($r:tt)*) => {
        let $var = parse_val!($it, $tr);
        parse!($it $($r)*);
    };
    ($it: ident, mut $var:ident : $tr:tt $($r:tt)*) => {
        let mut $var = parse_val!($it, $tr);
        parse!($it $($r)*);
    };
}

macro_rules! parse_val {
    ($it: ident, [$tr:tt; $len:expr]) => {
        (0..$len).map(|_| parse_val!($it, $tr)).collect::<Vec<_>>();
    };
    ($it: ident, $tr: ty) => {
        $it.next().unwrap().parse::<$tr>().unwrap()
    };
}

fn solve(s: &str) {
    let mut it = s.split_whitespace();
    parse!(it, n: usize, mut a: [usize; n]);
    let mut il = a.iter().enumerate().collect::<Vec<_>>();
    il.sort_by_key(|(i, &x)| x);
    il.reverse();
    let il = il.into_iter().map(|(i, x)| i).collect::<Vec<_>>();
    a.sort();
    a.reverse();
    let diff = |x, y| if x > y { x - y } else { y - x };
    let mut dp = vec![vec![0; n + 2]; n + 2];
    for x in 0..(n + 1) {
        for y in 0..(n + 1) {
            if x + y >= n {
                break;
            }
            dp[x + 1][y] = cmp::max(dp[x + 1][y], dp[x][y] + diff(x, il[x + y]) * a[x + y]);
            dp[x][y + 1] = cmp::max(
                dp[x][y + 1],
                dp[x][y] + diff(n - y - 1, il[x + y]) * a[x + y],
            );
        }
    }
    let mut ret = 0;
    for i in 0..n {
        ret = cmp::max(dp[i][n - i], ret);
    }
    println!("{}", ret);
}

fn main() {
    let mut s = String::new();
    stdin().read_to_string(&mut s).unwrap();
    solve(&s);
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test_input() {
        let s = "
        ";
        solve(s);
    }
}