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

#include <bits/stdc++.h>

using namespace std;

#define REP(i, a, b) for (int i = (a), i##_end_ = (b); i < i##_end_; ++i)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define mp make_pair
#define x first
#define y second
#define pb push_back
#define SZ(x) (int((x).size()))
#define ALL(x) (x).begin(), (x).end()

template <typename T> inline bool chkmin(T &a, const T &b) {
  return b < a ? a = b, 1 : 0;
}
template <typename T> inline bool chkmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}

typedef long long LL;

const int oo = 0x3f3f3f3f;

const int maxn = 50;

int n, m;

char g[maxn + 5][maxn + 5];

int dp[maxn + 5][maxn + 5][maxn + 5][maxn + 5];

int sum[maxn + 5][maxn + 5];

inline int get_sum(int xl, int yl, int xr, int yr) {
  return sum[xr][yr] - sum[xl][yr] - sum[xr][yl] + sum[xl][yl];
}

int px, py;

int ans = oo;

int main() {
#ifdef matthew99
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
#endif
  scanf("%d%d", &n, &m);
  REP(i, 0, n) scanf("%s", g[i]);
  px = py = -1;
  REP(i, 0, n) REP(j, 0, m) if (g[i][j] == 'P') px = i, py = j;
  REP(i, 0, n)
  REP(j, 0, m) sum[i + 1][j + 1] =
      sum[i + 1][j] + sum[i][j + 1] - sum[i][j] + (g[i][j] == '#');
  memset(dp, oo, sizeof dp);
  dp[0][0][n][m] = 0;
  REP(xl, 0, n)
  REP(yl, 0, m) for (int xr = n; xr > xl;
                     --xr) for (int yr = m; yr > yl;
                                --yr) if (dp[xl][yl][xr][yr] < oo) {
    REP(xmid, xl + 1, xr) REP(ymid, yl + 1, yr) {
      chkmin(dp[xl][yl][xmid][ymid], dp[xl][yl][xr][yr] +
                                         get_sum(xl, ymid, xmid, yr) +
                                         get_sum(xmid, yl, xr, ymid));
      chkmin(dp[xmid][ymid][xr][yr], dp[xl][yl][xr][yr] +
                                         get_sum(xl, ymid, xmid, yr) +
                                         get_sum(xmid, yl, xr, ymid));
      chkmin(dp[xl][ymid][xmid][yr], dp[xl][yl][xr][yr] +
                                         get_sum(xl, yl, xmid, ymid) +
                                         get_sum(xmid, ymid, xr, yr));
      chkmin(dp[xmid][yl][xr][ymid], dp[xl][yl][xr][yr] +
                                         get_sum(xl, yl, xmid, ymid) +
                                         get_sum(xmid, ymid, xr, yr));
    }
  }
  ans = oo;
  REP(xl, 0, px + 1)
  REP(yl, 0, py + 1) REP(xr, px + 1, n + 1)
      REP(yr, py + 1, m + 1) if (dp[xl][yl][xr][yr] < oo) {
    chkmin(ans, dp[xl][yl][xr][yr] + min({get_sum(xl, yl, px + 1, py + 1),
                                          get_sum(xl, py, px + 1, yr),
                                          get_sum(px, yl, xr, py + 1),
                                          get_sum(px, py, xr, yr)}));
  }
  printf("%d\\n", ans);
  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>

using namespace std;

#define REP(i, a, b) for (int i = (a), i##_end_ = (b); i < i##_end_; ++i)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define mp make_pair
#define x first
#define y second
#define pb push_back
#define SZ(x) (int((x).size()))
#define ALL(x) (x).begin(), (x).end()

template <typename T> inline bool chkmin(T &a, const T &b) {
  return b < a ? a = b, 1 : 0;
}
template <typename T> inline bool chkmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}

typedef long long LL;

const int oo = 0x3f3f3f3f;

const int maxn = 50;

int n, m;

char g[maxn + 5][maxn + 5];

int dp[maxn + 5][maxn + 5][maxn + 5][maxn + 5];

int sum[maxn + 5][maxn + 5];

inline int get_sum(int xl, int yl, int xr, int yr) {
  return sum[xr][yr] - sum[xl][yr] - sum[xr][yl] + sum[xl][yl];
}

int px, py;

int ans = oo;

int main() {
#ifdef matthew99
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
#endif
  scanf("%d%d", &n, &m);
  assert(n == m);
  REP(i, 0, n) scanf("%s", g[i]);
  px = py = -1;
  REP(i, 0, n) REP(j, 0, m) if (g[i][j] == 'P') px = i, py = j;
  REP(i, 0, n)
  REP(j, 0, m) sum[i + 1][j + 1] =
      sum[i + 1][j] + sum[i][j + 1] - sum[i][j] + (g[i][j] == '#');
  memset(dp, oo, sizeof dp);
  dp[0][0][n][m] = 0;
  REP(xl, 0, n)
  REP(yl, 0, m) REP(xr, xl + 1, n + 1)
      REP(yr, yl + 1, m + 1) if (dp[xl][yl][xr][yr] < oo) {
    REP(xmid, xl + 1, xr) REP(ymid, yl + 1, yr) {
      chkmin(dp[xl][yl][xmid][ymid], dp[xl][yl][xr][yr] +
                                         get_sum(xl, ymid, xmid, yr) +
                                         get_sum(xmid, yl, xr, ymid));
      chkmin(dp[xmid][ymid][xr][yr], dp[xl][yl][xr][yr] +
                                         get_sum(xl, ymid, xmid, yr) +
                                         get_sum(xmid, yl, xr, ymid));
      chkmin(dp[xl][ymid][xmid][yr], dp[xl][yl][xr][yr] +
                                         get_sum(xl, yl, xmid, ymid) +
                                         get_sum(xmid, ymid, xr, yr));
      chkmin(dp[xmid][yl][xr][ymid], dp[xl][yl][xr][yr] +
                                         get_sum(xl, yl, xmid, ymid) +
                                         get_sum(xmid, ymid, xr, yr));
    }
  }
  ans = oo;
  REP(xl, 0, px + 1)
  REP(yl, 0, py + 1) REP(xr, px + 1, n + 1)
      REP(yr, py + 1, m + 1) if (dp[xl][yl][xr][yr] < oo) {
    chkmin(ans, dp[xl][yl][xr][yr] + min({get_sum(xl, yl, px + 1, py + 1),
                                          get_sum(xl, py, px + 1, yr),
                                          get_sum(px, yl, xr, py + 1),
                                          get_sum(px, py, xr, yr)}));
  }
  printf("%d\\n", ans);
  return 0;
}