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

/* template.cpp {{{ */
#include <bits/stdc++.h>
using namespace std;
#define get_macro(a, b, c, d, name, ...) name
#define rep(...) get_macro(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__)
#define rrep(...)                                                              \\
  get_macro(__VA_ARGS__, rrep4, rrep3, rrep2, rrep1)(__VA_ARGS__)
#define rep1(n) rep2(i_, n)
#define rep2(i, n) rep3(i, 0, n)
#define rep3(i, a, b) rep4(i, a, b, 1)
#define rep4(i, a, b, s) for (ll i = (a); i < (ll)(b); i += (ll)(s))
#define rrep1(n) rrep2(i_, n)
#define rrep2(i, n) rrep3(i, 0, n)
#define rrep3(i, a, b) rrep4(i, a, b, 1)
#define rrep4(i, a, b, s) for (ll i = (ll)(b)-1; i >= (ll)(a); i -= (ll)(s))
#define each(x, c) for (auto &&x : c)
#define fs first
#define sc second
#define all(c) begin(c), end(c)
using ui = unsigned;
using ll = long long;
using ul = unsigned long long;
using ld = long double;
const int inf = 1e9 + 10;
const ll inf_ll = 1e18 + 10;
const ll mod = 1e9 + 7;
const ll mod9 = 1e9 + 9;
const int dx[]{-1, 0, 1, 0, -1, 1, 1, -1};
const int dy[]{0, -1, 0, 1, -1, -1, 1, 1};
template <class T, class U> void chmin(T &x, const U &y) { x = min<T>(x, y); }
template <class T, class U> void chmax(T &x, const U &y) { x = max<T>(x, y); }
struct prepare_ {
  prepare_() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(12);
  }
} prepare__;
/* }}} */

int n[2];
int a[2][50];
bool vis[60][60][60][60][2][3];
int dp[60][60][60][60][2][3];

int dfs(int i, int j, int x, int y, int p, int q, int s, int t) {
  if (vis[i][j][x][y][p][q])
    return dp[i][j][x][y][p][q];
  vis[i][j][x][y][p][q] = true;
  int res = -inf;
  if (i < n[p]) {
    if (a[p][i] == -1)
      chmax(res, -dfs(j, i + 1, 0, x + 1, p ^ 1, 0, 0, s));
    else
      chmax(res, -dfs(j, i + 1, y, x + 1, p ^ 1, 0, t, s + a[p][i]));
  }
  if (q == 2)
    chmax(res, 0);
  else
    chmax(res, s - t - dfs(j, i, 0, 0, p ^ 1, q + 1, 0, 0));
  return dp[i][j][x][y][p][q] = res;
}

int main() {
  rep(i, 2) cin >> n[i];
  rep(i, 2) rep(j, n[i]) cin >> a[i][j];
  cout << dfs(0, 0, 0, 0, 0, 0, 0, 0) << endl;
}

Error: TLE

Fixed submission:

/* template.cpp {{{ */
#include <bits/stdc++.h>
using namespace std;
#define get_macro(a, b, c, d, name, ...) name
#define rep(...) get_macro(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__)
#define rrep(...)                                                              \\
  get_macro(__VA_ARGS__, rrep4, rrep3, rrep2, rrep1)(__VA_ARGS__)
#define rep1(n) rep2(i_, n)
#define rep2(i, n) rep3(i, 0, n)
#define rep3(i, a, b) rep4(i, a, b, 1)
#define rep4(i, a, b, s) for (ll i = (a); i < (ll)(b); i += (ll)(s))
#define rrep1(n) rrep2(i_, n)
#define rrep2(i, n) rrep3(i, 0, n)
#define rrep3(i, a, b) rrep4(i, a, b, 1)
#define rrep4(i, a, b, s) for (ll i = (ll)(b)-1; i >= (ll)(a); i -= (ll)(s))
#define each(x, c) for (auto &&x : c)
#define fs first
#define sc second
#define all(c) begin(c), end(c)
using ui = unsigned;
using ll = long long;
using ul = unsigned long long;
using ld = long double;
const int inf = 1e9 + 10;
const ll inf_ll = 1e18 + 10;
const ll mod = 1e9 + 7;
const ll mod9 = 1e9 + 9;
const int dx[]{-1, 0, 1, 0, -1, 1, 1, -1};
const int dy[]{0, -1, 0, 1, -1, -1, 1, 1};
template <class T, class U> void chmin(T &x, const U &y) { x = min<T>(x, y); }
template <class T, class U> void chmax(T &x, const U &y) { x = max<T>(x, y); }
struct prepare_ {
  prepare_() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(12);
  }
} prepare__;
/* }}} */

int n[2];
int a[2][50];
bool vis[60][60][60][60][2][3];
int dp[60][60][60][60][2][3];

int dfs(int i, int j, int x, int y, int p, int q, int s, int t) {
  if (vis[i][j][x][y][p][q])
    return dp[i][j][x][y][p][q];
  int res = -inf;
  if (i < n[p]) {
    if (a[p][i] == -1)
      chmax(res, -dfs(j, i + 1, 0, x + 1, p ^ 1, 0, 0, s));
    else
      chmax(res, -dfs(j, i + 1, y, x + 1, p ^ 1, 0, t, s + a[p][i]));
  }
  if (q == 2)
    chmax(res, 0);
  else
    chmax(res, s - t - dfs(j, i, 0, 0, p ^ 1, q + 1, 0, 0));
  return res;
}

int main() {
  rep(i, 2) cin >> n[i];
  rep(i, 2) rep(j, n[i]) cin >> a[i][j];
  memset(dp, -1, sizeof(dp));
  cout << dfs(0, 0, 0, 0, 0, 0, 0, 0) << endl;
}