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<algorithm>
#include<bitset>
#include<cmath>
#include<cstdlib>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<string>
#include<utility>
#include<vector>

using namespace std;
 
typedef long long ll;

#define PB push_back
#define MP make_pair
#define F first
#define S second

template<typename T,typename U>
bool chmax(T& max, const U& x){
	if(max<x){
		max = x;
		return true;
	}
	return false;
}

template<typename T,typename U>
bool chmin(T& min, const U& x){
	if(min>x){
		min = x;
		return true;
	}
	return false;
}


int main(){
	ll n,ans=0;
  	cin >> n;
  	priority_queue<pair<ll,ll>> a;
  	for(ll i=0;i<n;i++){
      	ll tmp;
    	cin >> tmp;
      	a.push(MP(tmp,i));
    }
  	pair<ll,ll> kouho = MP(0,n-1);
  
  	while(!a.empty()){
    	pair<ll,ll> tmp = a.top();
      	a.pop();
      	if(abs(tmp.S-kouho.F)<abs(tmp.S-kouho.S)){
        	ans += tmp.F*abs(tmp.S-kouho.S);
          	kouho.S--;
        }else if(abs(tmp.S-kouho.F)>abs(tmp.S-kouho.S)){
        	ans += tmp.F*abs(tmp.S-kouho.F);
          	kouho.F++;
        }else{
        	if(a.empty()){
            	ans += tmp.F*abs(tmp.S-kouho.S);
            }else{
            	if(tmp.S > a.top().S){
                	ans += tmp.F*abs(tmp.S-kouho.F);
          			kouho.F++;
                }else{
                	ans += tmp.F*abs(tmp.S-kouho.S);
          			kouho.S--;
                }
            }
        }
    }
  	cout << ans << endl;
}