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: Wrong Answer)

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, a: [usize; n]);
    let mut target = vec![None; n];
    let mut l: Vec<usize> = vec![0; n];
    let mut r: Vec<usize> = vec![0; n];
    let mut curl = 0;
    let mut curr = n - 1;
    let diff = |x, y| if x > y { x - y } else { y - x };
    let update = |curl, curr, l: &mut Vec<usize>, r: &mut Vec<usize>| {
        for i in 0..n {
            l[i] = diff(i, curl) * a[i];
        }
        for i in 0..n {
            r[i] = diff(i, curr) * a[i];
        }
    };
    for _ in 0..n {
        update(curl, curr, &mut l, &mut r);
        let mut tr = n;
        let mut mtr = None;
        for i in 0..n {
            if target[i] == None {
                if let Some(mtr) = mtr {
                    if mtr >= r[i] {
                        continue;
                    }
                }
                mtr = Some(r[i]);
                tr = i;
            }
        }
        let mut tl = n;
        let mut mtl = None;
        for i in (0..n).rev() {
            if target[i] == None {
                if let Some(mtl) = mtl {
                    if mtl >= l[i] {
                        continue;
                    }
                }
                mtl = Some(l[i]);
                tl = i;
            }
        }
        if mtl > mtr {
            target[tl] = Some(curl);
            curl += 1;
        } else {
            target[tr] = Some(curr);
            if curr != 0 {
                curr -= 1;
            }
        }
    }
    let mut ret = 0;
    for i in 0..n {
        let j = target[i].unwrap();
        ret += diff(i, j) * a[i];
    }
    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);
    }
}