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 PyPy3 (7.3.0) (judge verdict: Runtime Error)

#!/usr/bin/env python3
import sys
import numpy as np

def solve(N: int, A: "List[int]"):
    a=np.argsort(A)[::-1]

    dp = np.zeros((N+1,N+1), dtype=np.int)
    for i, a_ind in enumerate(a):
        x_p_y = i+1
        a_ = A[a_ind]
        # print("a_ : {}, a_ind : {}".format(a_, a_ind))
        for x in range(0, x_p_y+1):
            y = x_p_y - x
            if x-1<0: x_add = 0
            else : x_add = dp[x-1, y] + a_*abs(a_ind-x+1)
            if y-1<0: y_add = 0
            else : y_add = dp[x, y-1] + a_*abs(N-y - a_ind)
            dp[x, y] = max(x_add, y_add)
    print(np.max(dp))

    return


# Generated by 1.1.6 https://github.com/kyuridenamida/atcoder-tools  (tips: You use the default template now. You can remove this line by using your custom template)
def main():
    def iterate_tokens():
        for line in sys.stdin:
            for word in line.split():
                yield word
    tokens = iterate_tokens()
    N = int(next(tokens))  # type: int
    A = [int(next(tokens)) for _ in range(N)]  # type: "List[int]"
    solve(N, A)

if __name__ == '__main__':
    main()