Problem p02709 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
#define int long long
#define ff first
#define ss second
#define pii pair<long long, long long>
using namespace std;

int MOD = (1e9) + 7;
const int N = 2005;

pii a[N];
int dp[N][N], n;

int rec(int l, int r) {
  if (l > r)
    return 0;
  if (dp[l][r] != -1)
    return dp[l][r];
  int id = n - r + l;
  dp[l][r] = max(rec(l + 1, r) + (a[id].ff * abs(a[id].ss - l)),
                 rec(l, r - 1) + (a[id].ff * abs(a[id].ss - r)));
  return dp[l][r];
}

signed main() {
  memset(dp, -1, sizeof(dp));
  cin >> n;
  for (int i = 1; i <= n; i++)
    cin >> a[i].ff, a[i].ss = i;
  sort(a + 1, a + n + 1);
  for (int i = 1, j = n; i < j; i++, j--)
    swap(a[i], a[j]);
  cout << rec(1, n) << endl;
  return 0;
}


Error: TLE

Fixed submission:

///...................SUBHASHIS MOLLICK...................///
///.....DEPARTMENT OF COMPUTER SCIENCE AND ENGINEERING....///
///.............ISLAMIC UNIVERSITY,BANGLADESH.............///
///....................SESSION-(14-15)....................///
#include <bits/stdc++.h>
using namespace std;
#define sf(a) scanf("%d", &a)
#define sf2(a, b) scanf("%d %d", &a, &b)
#define sf3(a, b, c) scanf("%d %d %d", &a, &b, &c)
#define pf(a) printf("%d", a)
#define pf2(a, b) printf("%d %d", a, b)
#define pf3(a, b, c) printf("%d %d %d", a, b, c)
#define sfl(a) scanf("%lld", &a)
#define sfl2(a, b) scanf("%lld %lld", &a, &b)
#define sfl3(a, b, c) scanf("%lld %lld %lld", &a, &b, &c)
#define pfl(a) printf("%lld", a)
#define pfl2(a, b) printf("%lld %lld", a, b)
#define pfl3(a, b, c) printf("%lld %lld %lld", a, b, c)
#define nl printf("\\n")
#define timesave                                                               \\
  ios_base::sync_with_stdio(false);                                            \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define ll long long
#define pb push_back
#define MPI map<int, int> mp;
#define fr(i, n) for (i = 0; i < n; i++)
#define fr1(i, n) for (i = 1; i <= n; i++)
#define frl(i, a, b) for (i = a; i <= b; i++)
#define tz 100000
#define clr0(a) memset(a, 0, sizeof(a))
#define clr1(a) memset(a, -1, sizeof(a))
/*primes in range 1 - n
1 - 100(1e2) -> 25 pimes
1 - 1000(1e3) -> 168 primes
1 - 10000(1e4) -> 1229 primes
1 - 100000(1e5) -> 9592 primes
1 - 1000000(1e6) -> 78498 primes
1 - 10000000(1e7) -> 664579 primes
large primes ->
104729 1299709 15485863 179424673 2147483647 32416190071 112272535095293
48112959837082048697
*/
// freopen("Input.txt","r",stdin);
// freopen("Output.txt","w",stdout);
// const int fx[]={+1,-1,+0,+0};
// const int fy[]={+0,+0,+1,-1};
// const int fx[]={+0,+0,+1,-1,-1,+1,-1,+1};   // Kings Move
// const int fy[]={-1,+1,+0,+0,+1,+1,-1,-1};  // Kings Move
// const int fx[]={-2, -2, -1, -1,  1,  1,  2,  2};  // Knights Move
// const int fy[]={-1,  1, -2,  2, -2,  2, -1,  1}; // Knights Move
vector<pair<ll, ll>> ar;
ll mx = 0;
void printArr(ll n) {
  ll ans = 0;
  for (ll i = 0; i < n; i++) {
    ans = ans + (ar[i].first * abs(ar[i].second - i));
  }
  mx = max(mx, ans);
}
void heapPermutation(ll sz, ll n) {
  if (sz == 1) {
    printArr(n);
    return;
  }
  for (ll i = 0; i < sz; i++) {
    heapPermutation(sz - 1, n);
    if (sz % 2 == 1)
      swap(ar[0], ar[sz - 1]);
    else
      swap(ar[i], ar[sz - 1]);
  }
}
int main() {
  timesave;
  ll n, a;
  cin >> n;
  for (ll i = 0; i < n; i++) {
    cin >> a;
    ar.push_back({a, i});
  }
  heapPermutation(n, n);
  cout << mx << endl;
  return 0;
}