Problem p03171 (C++)

Buggy submission (status: Time Limit Exceeded):
// May this submission get accepted!

#pragma GCC optimize("O3")
#pragma GCC target("tune=native")
#pragma GCC target("avx")

#include <bits/stdc++.h>

// 汎用マクロ
#define ALL_OF(x) (x).begin(), (x).end()
#define REP(i, n) for (long long i = 0, i##_len = (n); i < i##_len; i++)
#define RANGE(i, is, ie)                                                       \
  for (long long i = (is), i##_end = (ie); i <= i##_end; i++)
#define DSRNG(i, is, ie)                                                       \
  for (long long i = (is), i##_end = (ie); i >= i##_end; i--)
#define UNIQUE(v)                                                              \
  do {                                                                         \
    sort((v).begin(), (v).end());                                              \
    (v).erase(unique((v).begin(), (v).end()), (v).end());                      \
  } while (false)
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
#define INF 0x7FFFFFFF
#define LINF 0x7FFFFFFFFFFFFFFFLL
#define Yes(q) ((q) ? "Yes" : "No")
#define YES(q) ((q) ? "YES" : "NO")
#define Possible(q) ((q) ? "Possible" : "Impossible")
#define POSSIBLE(q) ((q) ? "POSSIBLE" : "IMPOSSIBLE")
#define DUMP(q)                                                                \
  cerr << "[DEBUG] " #q ": " << (q) << " at " __FILE__ ":" << __LINE__ << endl
#define DUMPALL(q)                                                             \
  do {                                                                         \
    cerr << "[DEBUG] " #q ": [";                                               \
    REP(i, (q).size()) { cerr << (q)[i] << (i == i_len - 1 ? "" : ", "); }     \
    cerr << "] at " __FILE__ ":" << __LINE__ << endl;                          \
  } while (false)
template <class T> T gcd(const T &a, const T &b) {
  return a < b ? gcd(b, a) : b ? gcd(b, a % b) : a;
}
template <class T> T lcm(const T &a, const T &b) { return a / gcd(a, b) * b; }

// gcc拡張マクロ
#define popcount __builtin_popcount
#define popcountll __builtin_popcountll

// エイリアス
#define DANCE_ long
#define ROBOT_ unsigned
#define HUMAN_ signed
#define CHOKUDAI_ const
using ll = DANCE_ HUMAN_ DANCE_;
using ull = DANCE_ ROBOT_ DANCE_;
using cll = DANCE_ DANCE_ CHOKUDAI_;
using ld = long double;
using namespace std;

// モジュール
ll solve(vector<vector<vector<ll>>> &dp, vector<ll> &a, ll l, ll r, ll i) {
  if (l == r)
    return 0;
  if (dp[l][r][i] != -LINF)
    return dp[l][r][i];
  const ll sgn = !i ? 1 : -1;
  ll c1 = solve(dp, a, l + 1, r, !i) + a[l] * sgn;
  ll c2 = solve(dp, a, l, r - 1, !i) + a[r - 1] * sgn;
  return !i ? max(c1, c2) : min(c1, c2);
}

// 処理内容
int main() {

  ll n;
  cin >> n;
  vector<ll> a(n);
  REP(i, n) cin >> a[i];

  // dp[l][r][i] := [l,r)が残っててiの番が来た時に達成できるX-Yの最大値
  vector<vector<vector<ll>>> dp(
      n, vector<vector<ll>>(n + 1, vector<ll>(2, -LINF)));
  cout << solve(dp, a, 0, n, 0) << endl;
}

Fixed submission:
// May this submission get accepted!

#pragma GCC optimize("O3")
#pragma GCC target("tune=native")
#pragma GCC target("avx")

#include <bits/stdc++.h>

// 汎用マクロ
#define ALL_OF(x) (x).begin(), (x).end()
#define REP(i, n) for (long long i = 0, i##_len = (n); i < i##_len; i++)
#define RANGE(i, is, ie)                                                       \
  for (long long i = (is), i##_end = (ie); i <= i##_end; i++)
#define DSRNG(i, is, ie)                                                       \
  for (long long i = (is), i##_end = (ie); i >= i##_end; i--)
#define UNIQUE(v)                                                              \
  do {                                                                         \
    sort((v).begin(), (v).end());                                              \
    (v).erase(unique((v).begin(), (v).end()), (v).end());                      \
  } while (false)
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
#define INF 0x7FFFFFFF
#define LINF 0x7FFFFFFFFFFFFFFFLL
#define Yes(q) ((q) ? "Yes" : "No")
#define YES(q) ((q) ? "YES" : "NO")
#define Possible(q) ((q) ? "Possible" : "Impossible")
#define POSSIBLE(q) ((q) ? "POSSIBLE" : "IMPOSSIBLE")
#define DUMP(q)                                                                \
  cerr << "[DEBUG] " #q ": " << (q) << " at " __FILE__ ":" << __LINE__ << endl
#define DUMPALL(q)                                                             \
  do {                                                                         \
    cerr << "[DEBUG] " #q ": [";                                               \
    REP(i, (q).size()) { cerr << (q)[i] << (i == i_len - 1 ? "" : ", "); }     \
    cerr << "] at " __FILE__ ":" << __LINE__ << endl;                          \
  } while (false)
template <class T> T gcd(const T &a, const T &b) {
  return a < b ? gcd(b, a) : b ? gcd(b, a % b) : a;
}
template <class T> T lcm(const T &a, const T &b) { return a / gcd(a, b) * b; }

// gcc拡張マクロ
#define popcount __builtin_popcount
#define popcountll __builtin_popcountll

// エイリアス
#define DANCE_ long
#define ROBOT_ unsigned
#define HUMAN_ signed
#define CHOKUDAI_ const
using ll = DANCE_ HUMAN_ DANCE_;
using ull = DANCE_ ROBOT_ DANCE_;
using cll = DANCE_ DANCE_ CHOKUDAI_;
using ld = long double;
using namespace std;

// モジュール
ll solve(vector<vector<vector<ll>>> &dp, vector<ll> &a, ll l, ll r, ll i) {
  if (l == r)
    return 0;
  if (dp[l][r][i] != -LINF)
    return dp[l][r][i];
  const ll sgn = !i ? 1 : -1;
  ll c1 = solve(dp, a, l + 1, r, !i) + a[l] * sgn;
  ll c2 = solve(dp, a, l, r - 1, !i) + a[r - 1] * sgn;
  return dp[l][r][i] = !i ? max(c1, c2) : min(c1, c2);
}

// 処理内容
int main() {

  ll n;
  cin >> n;
  vector<ll> a(n);
  REP(i, n) cin >> a[i];

  // dp[l][r][i] := [l,r)が残っててiの番が来た時に達成できるX-Yの最大値
  vector<vector<vector<ll>>> dp(
      n, vector<vector<ll>>(n + 1, vector<ll>(2, -LINF)));
  cout << solve(dp, a, 0, n, 0) << endl;
}