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 C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
#define repr(i,from,to) for(int (i)=(from);(i)<(to);(i)++)
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
// const bool debug=true;
const bool debug=false;
#define DEBUG if(debug==true)
#define all(x) begin((x)), end((x))
#define vprint(x) for(auto a:(x)) cout << x << endl;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll MOD = 1000000007;
template<class T> inline bool chmin(T& a, T b) {
    if (a > b) { a = b; return true;}
    return false;
}
template<class T> inline bool chmax(T& a, T b) {
    if (a < b) { a = b; return true;}
    return false;
}


int main(void) {
    cin.tie(0);
    ios::sync_with_stdio(false);
    ll n;cin>>n;
    vector<pair<ll,ll>> a;
    rep(i,n) {
        ll tmp;cin>>tmp;
        a.emplace_back(tmp, i);
    }
    if (n==1) {
        cout << 0 << endl;
        return 0;
    }
    if (n==2) {
        cout << a[0].first + a[1].first << endl;
        return 0;
    }
    vector<bool> chk(n, true);
    vector<vector<ll>> dp(n+1,vector<ll>(n+1,0));
    sort(all(a),greater<pair<ll,ll>>());
    rep(i,n) {
        rep(j,i+1) {
            ll place = a[i].second, value = a[i].first;
            if (place!=j) {
                chmax(dp[i+1][j+1], dp[i][j] + value * abs(place-j));
            }
            if (place != n-1-i+j) {
                chmax(dp[i+1][j], dp[i][j] + value * abs(n-1-i+j-place));
            }
        }
    }
    ll res = 0;
    rep(i,n+1) {
        chmax(res, dp[n][i]);
    }
    cout << res << endl;
    return 0;
}