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

#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define INF 1 << 30
#define LINF 1LL << 60

/*
<url:https://www.ioi-jp.org/joi/2014/2015-ho/2015-ho.pdf>
?????????============================================================

?????¢?????±??????????????????N(1<=N<=2000)????????????????????????????????????????????????
????????????1??????N?????§???????¨???????????????????????????????????????§i???????????????????????§?????????Ai?????????

??????N??????JOI????????¨IOI???????????§?¬??????????????????????

1.
?????? JOI ????????? N ????????????????\\??????? 1 ??????????????§?????????

2.
????????????IOI ??????????????????????????? IOI ???????????¨ JOI
??????????????????????????????????????? 1 ??????????????£????????????
?????????????????£??????????????????????°?????????¨??????????????¢????????????????????????????????????????????????????????¨?????§?????????
??????????????????????????°????????¨?????????IOI
????????????????????????????????§???????????????????????§????????? JOI
???????????????????????§?\\????????????????????????§???????????¨?????§?????????

JOI
?????????????????????????????????????????????????????§?????????????¨?????????§???????????????
=================================================================
?§£??¬=============================================================
================================================================
*/
ll res = 0;
ll N;
vector<ll> A;
vector<vector<ll>> memo;
ll rec(int l, int r, int cur, bool first) {
  if (first) {
    return rec((l - 1 + N) % N, (r + 1) % N, 1, false) + A[l];
  }
  if (l == r) {
    if (cur == 0) {
      if (memo[l][r] != 0)
        return memo[l][r];
      else
        return memo[l][r] = A[l];
    } else {
      return 0;
    }
  }

  if (cur == 0) {
    ll &res = memo[l][r];
    if (res != 0)
      return res;
    res = max(res, rec((l - 1 + N) % N, r, 1, false) + A[l]);
    res = max(res, rec(l, (r + 1) % N, 1, false) + A[r]);
    return res;
  } else {
    if (A[l] > A[r]) {
      return rec((l - 1 + N) % N, r, 0, false);
    } else {
      return rec(l, (r + 1) % N, 0, false);
    }
  }
}
int main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> N;
  A.assign(N, 0);
  memo.assign(N, vector<ll>(N, 0));
  for (auto &in : A)
    cin >> in;
  ll res = 0;
  for (int i = 0; i < N; i++) {
    res = max(res, rec(i, i, 0, true));
  }
  cout << res << endl;
  return 0;
}

Error: TLE

Fixed submission:

#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define INF 1 << 30
#define LINF 1LL << 60

/*
<url:https://www.ioi-jp.org/joi/2014/2015-ho/2015-ho.pdf>
?????????============================================================

?????¢?????±??????????????????N(1<=N<=2000)????????????????????????????????????????????????
????????????1??????N?????§???????¨???????????????????????????????????????§i???????????????????????§?????????Ai?????????

??????N??????JOI????????¨IOI???????????§?¬??????????????????????

1.
?????? JOI ????????? N ????????????????\\??????? 1 ??????????????§?????????

2.
????????????IOI ??????????????????????????? IOI ???????????¨ JOI
??????????????????????????????????????? 1 ??????????????£????????????
?????????????????£??????????????????????°?????????¨??????????????¢????????????????????????????????????????????????????????¨?????§?????????
??????????????????????????°????????¨?????????IOI
????????????????????????????????§???????????????????????§????????? JOI
???????????????????????§?\\????????????????????????§???????????¨?????§?????????

JOI
?????????????????????????????????????????????????????§?????????????¨?????????§???????????????
=================================================================
?§£??¬=============================================================
================================================================
*/
ll res = 0;
ll N;
vector<ll> A;
void rec(int l, int r, int cur, ll sum) {
  if (l == r) {
    if (cur == 0)
      sum += A[l];
    res = max(res, sum);
    return;
  }
  if (cur == 0) {
    rec((l - 1 + N) % N, r, 1, sum + A[l]);
    rec(l, (r + 1) % N, 1, sum + A[r]);
  } else {
    if (A[l] > A[r]) {
      rec((l - 1 + N) % N, r, 0, sum);
    } else {
      rec(l, (r + 1) % N, 0, sum);
    }
  }
  return;
}
int main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> N;
  A.assign(N, 0);
  for (auto &in : A)
    cin >> in;
  for (int i = 0; i < N; i++) {
    rec((i - 1 + N) % N, (i + 1) % N, 1, A[i]);
  }
  cout << res << endl;
  return 0;
}