#include <bits/stdc++.h>
using namespace std;
int n;
long long f[2010][2010];
struct Elem {
  int oriPos;
  int val;
};
Elem a[2010];
bool compare(const Elem &a, const Elem &b) {
  if (a.val == b.val) {
    return a.oriPos < b.oriPos;
  } else {
    return a.val > b.val;
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d", &(a[i].val));
    a[i].oriPos = i;
  }
  sort(a, a + n, compare);
  f[0][0] = 0;
  int count = 0;
  for (int i = 0; i < n; i++) {
    count++;
    for (int l = 0; l <= count; l++) {
      int r = count - l;
      long long curMax = 0;
      if (l == 0) {
        int rPos = n - r;
        curMax = f[l][r - 1] + abs(rPos - a[i].oriPos) * a[i].val;
      } else if (r == 0) {
        int lPos = l - 1;
        curMax = f[l - 1][r] + abs(lPos - a[i].oriPos) * a[i].val;
      } else {
        int rPos = n - r;
        int lPos = l - 1;
        long long lVal = f[l][r - 1] + abs(rPos - a[i].oriPos) * a[i].val;
        long long rVal = f[l - 1][r] + abs(lPos - a[i].oriPos) * a[i].val;
        if (lVal > rVal)
          curMax = lVal;
        else
          curMax = rVal;
      }
      if (f[l][r] < curMax) f[l][r] = curMax;
    }
  }
  long long realMax = 0;
  for (int l = 0; l <= n; l++) {
    int r = n - l;
    if (realMax < f[l][r]) realMax = f[l][r];
  }
  printf("%lld\n", realMax);
  return 0;
}
