Problem p01842 (C++) — buggy submission, verdict: Runtime Error

#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define ll long long
#define ld long double
#define EPS 0.0000000001
#define INF 1e9
#define MOD 1000000007
#define rep(i, n) for (int i = 0; i < (n); i++)
#define loop(i, a, n) for (i = a; i < (n); i++)
#define all(in) in.begin(), in.end()
#define shosu(x) fixed << setprecision(x)

typedef vector<int> vi;
typedef vector<string> vs;
typedef pair<int, int> pii;

int dp[55][55][55][55][2][3]; // スコアの最大値

int a[50], b[50];
int n, m;

// in stack [a1,a2)
//  a1 … a2 - 1 (if a1 == a2 then empty)
//  b1 … b2 - 1 (if b1 == b2 then empty)

int dfs(int a1, int a2, int b1, int b2, int turn, int pass, int asum,
        int bsum) {
  if (pass == 3) {
    return 0;
  }
  if (dp[a1][a2][b1][b2][turn][pass] != -INF) {

    return dp[a1][a2][b1][b2][turn][pass];
  }
  if (turn) { // b

    int ret = INF; // 最小化
    ret = min(ret, dfs(a2, a2, b2, b2, 0, pass + 1, 0, 0) + asum - bsum); // pass
    if (b2 < m) {        // カードを出す
      if (b[b2] == -1) { // 妨害カードを出す
        ret = min(ret, dfs(a1, a2, b1, b2 + 1, 0, 0, 0, bsum));
      } else { // 普通のカードを出す
        ret = min(ret, dfs(a1, a2, b1, b2 + 1, 0, 0, asum, bsum + b[b2]));
      }
    }
    dp[a1][a2][b1][b2][turn][pass] = ret;

    return ret;
  } else { // a

    int ret = -INF; // 最大化
    ret = max(ret, dfs(a2, a2, b2, b2, 1, pass + 1, 0, 0) + asum - bsum); // pass
    if (a2 < n) {        // カードを出す
      if (a[a2] == -1) { // 妨害カードを出す
        ret = max(ret, dfs(a1, a2 + 1, b1, b2, 1, 0, asum, 0));
      } else { // 普通のカードを出す
        ret = max(ret, dfs(a1, a2 + 1, b1, b2, 1, 0, asum + a[a2], bsum));
      }
    }
    dp[a1][a2][b1][b2][turn][pass] = ret;

    return ret;
  }
}

signed main(void) {

  cin >> n >> m;
  rep(i, n) { cin >> a[i]; }
  rep(i, m) { cin >> b[i]; }

  rep(i, 55) rep(j, 55) rep(k, 55) rep(l, 55) rep(x, 2) rep(y, 3)
      dp[i][j][k][l][x][y] = -INF;

  cout << dfs(0, 0, 0, 0, 0, 1, 0, 0) << endl;
}


Error: -11

Fixed submission:

#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define ll long long
#define ld long double
#define EPS 0.0000000001
#define INF 1e9
#define MOD 1000000007
#define rep(i, n) for (int i = 0; i < (n); i++)
#define loop(i, a, n) for (i = a; i < (n); i++)
#define all(in) in.begin(), in.end()
#define shosu(x) fixed << setprecision(x)

typedef vector<int> vi;
typedef vector<string> vs;
typedef pair<int, int> pii;

#define inf 1LL * INF *INF
#define int ll
ll dp[50][50][50][50][2][3]; // スコアの最大値

int a[50], b[50];
int n, m;

// in stack [a1,a2)
//  a1 … a2 - 1 (if a1 == a2 then empty)
//  b1 … b2 - 1 (if b1 == b2 then empty)

ll dfs(int a1, int a2, int b1, int b2, int turn, int pass, int asum, int bsum) {
  if (pass == 3) {
    return 0;
  }
  if (dp[a1][a2][b1][b2][turn][pass] != -inf) {
    return dp[a1][a2][b1][b2][turn][pass];
  }
  if (turn) { // b

    ll ret = inf; // 最小化
    ret = min(ret, dfs(a2, a2, b2, b2, 0, pass + 1, 0, 0) + asum - bsum); // pass
    if (b2 < m) {        // カードを出す
      if (b[b2] == -1) { // 妨害カードを出す
        ret = min(ret, dfs(a1, a2, b1, b2 + 1, 0, 0, 0, bsum));
      } else { // 普通のカードを出す
        ret = min(ret, dfs(a1, a2, b1, b2 + 1, 0, 0, asum, bsum + b[b2]));
      }
    }
    dp[a1][a2][b1][b2][turn][pass] = ret;
    return ret;
  } else { // a

    ll ret = -inf; // 最大化
    ret = max(ret, dfs(a2, a2, b2, b2, 1, pass + 1, 0, 0) + asum - bsum); // pass
    if (a2 < n) {        // カードを出す
      if (a[a2] == -1) { // 妨害カードを出す
        ret = max(ret, dfs(a1, a2 + 1, b1, b2, 1, 0, asum, 0));
      } else { // 普通のカードを出す
        ret = max(ret, dfs(a1, a2 + 1, b1, b2, 1, 0, asum + a[a2], bsum));
      }
    }
    dp[a1][a2][b1][b2][turn][pass] = ret;
    return ret;
  }
}

signed main(void) {

  cin >> n >> m;
  rep(i, n) { cin >> a[i]; }
  rep(i, m) { cin >> b[i]; }

  rep(i, 50) rep(j, 50) rep(k, 50) rep(l, 50) rep(x, 2) rep(y, 3)
      dp[i][j][k][l][x][y] = -inf;

  cout << dfs(0, 0, 0, 0, 0, 1, 0, 0) << endl;
}