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

#include <bits/stdc++.h>

using namespace std;

#define N 55

const int INF = (int)1e9;

bool adj[N][N][N][N];
int f[N][N][N][N];
char mat[N][N];
int n, m;
vector<pair<int, int>> vec[26];

bool ok(int x, int y) {
  return x >= 0 && x < n && y >= 0 && y < m && mat[x][y] != '#';
}

int dfs(int lx, int ly, int rx, int ry) {
  if (f[lx][ly][rx][ry] != -1)
    return f[lx][ly][rx][ry];
  if (lx > rx || ly > ry) {
    return f[lx][ly][rx][ry] = 0;
  }
  if (!adj[lx][ly][rx][ry]) {
    return f[lx][ly][rx][ry] = -INF;
  }

  int res = 0;

  if (mat[lx][ly] >= 'a' && mat[lx][ly] <= 'z') {
    int id = mat[lx][ly] - 'a';

    for (int i = 0; i < vec[id].size(); i++) {
      int x = vec[id][i].first, y = vec[id][i].second;

      if (!adj[lx][ly][x][y])
        continue;

      if (x >= lx && x <= rx && y >= ly && y <= ry) {
        if (ok(lx + 1, ly)) {
          if (ok(x - 1, y)) {
            res = max(res, dfs(lx + 1, ly, x - 1, y) + 1 + dfs(x, y, rx, ry));
          }
          if (ok(x, y - 1)) {
            res = max(res, dfs(lx + 1, ly, x, y - 1) + 1 + dfs(x, y, rx, ry));
          }
        }

        if (ok(lx, ly + 1)) {
          if (ok(x - 1, y)) {
            res = max(res, dfs(lx, ly + 1, x - 1, y) + 1 + dfs(x, y, rx, ry));
          }
          if (ok(x, y - 1)) {
            res = max(res, dfs(lx, ly + 1, x, y - 1) + 1 + dfs(x, y, rx, ry));
          }
        }
      }

      /*
      if (lx == 1 && ly == 1 && rx == 4 && ry == 4) {
              cout << "here" << endl;
              cout << res << endl;
              cout << id << endl;
              cout << x << ' ' << y << endl;
      }*/
    }
  }

  if (ok(lx + 1, ly)) {
    res = max(res, dfs(lx + 1, ly, rx, ry));
  }
  if (ok(lx, ly + 1)) {
    res = max(res, dfs(lx, ly + 1, rx, ry));
  }

  return f[lx][ly][rx][ry] = res;
}

int main() {
  while (~scanf("%d%d", &n, &m)) {
    if (n + m == 0)
      break;

    for (int i = 0; i < 26; i++) {
      vec[i].clear();
    }

    for (int i = 0; i < n; i++) {
      scanf("%s", mat[i]);
      for (int j = 0; j < m; j++) {
        if (mat[i][j] >= 'A' && mat[i][j] <= 'Z') {
          int id = mat[i][j] - 'A';
          vec[id].push_back(make_pair(i, j));
        }
      }
    }

    memset(adj, 0, sizeof(adj));
    memset(f, -1, sizeof(f));

    for (int i = n - 1; i >= 0; i--) {
      for (int j = m - 1; j >= 0; j--) {

        if (mat[i][j] == '#')
          continue;

        for (int x = i; x < n; x++) {
          for (int y = j; y < m; y++) {
            if (ok(i + 1, j)) {
              adj[i][j][x][y] |= adj[i + 1][j][x][y];
            }
            if (ok(i, j + 1)) {
              adj[i][j][x][y] |= adj[i][j + 1][x][y];
            }
          }
        }

        adj[i][j][i][j] = 1;
      }
    }

    int res = dfs(0, 0, n - 1, m - 1);

    /*

    for (int x = 0; x < n; x++) {
            for (int y = 0; y < m; y++) {
                    for (int i = x; i < n; i++) {
                            for (int j = y; j < m; j++) {
                                    if (f[x][y][i][j] == 1) {
                                            cout << "yes" << endl;
                                            cout << x << ' ' << y << endl;
                                            cout << i << ' ' << j << endl;
                                    }
                            }
                    }
            }
    }*/

    if (res == -INF)
      puts("-1");
    else
      printf("%d\\n", res);
  }
  return 0;
}

Error: -11

Fixed submission:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>

using namespace std;

int T, n, num, m;
char z[55][55];
int dp[55][55][55][55];
int vi[55][55];
void dfs(int q, int w) {
  if (z[q][w] == '#')
    return;
  vi[q][w] = 1;
  if (q == n - 1 && w == m - 1)
    return;
  if (vi[q + 1][w] == 0)
    dfs(q + 1, w);
  if (vi[q][w + 1] == 0)
    dfs(q, w + 1);
}
int main() {
  while (~scanf("%d%d", &n, &m)) {
    if (n == 0 && m == 0)
      break;
    for (int q = 0; q < n; q++)
      scanf("%s", z[q]);
    memset(dp, 0, sizeof dp);
    memset(vi, 0, sizeof vi);
    dfs(0, 0);
    if (vi[n - 1][m - 1] == 0) {
      printf("-1\\n");
      continue;
    }
    for (int w = 0; w <= n; w++)
      for (int q = 0; q + w <= n; q++)
        for (int r = 0; r <= m; r++)
          for (int e = 0; e + r <= m; e++) {
            if (q + w >= q + 1 && e + r >= e + 2) {
              if (z[q][e] - 'a' == z[q + w - 1][e + r - 1] - 'A')
                dp[q][q + w][e][e + r] = max(
                    dp[q][q + w][e][e + r], dp[q][q + w][e + 1][e + r - 1] + 1);
              else
                dp[q][q + w][e][e + r] =
                    max(dp[q][q + w][e][e + r], dp[q][q + w][e + 1][e + r - 1]);
            }
            if (q + w >= q + 2 && e + r >= e + 1) {
              if (z[q][e] - 'a' == z[q + w - 1][e + r - 1] - 'A')
                dp[q][q + w][e][e + r] = max(
                    dp[q][q + w][e][e + r], dp[q + 1][q + w - 1][e][e + r] + 1);
              else
                dp[q][q + w][e][e + r] =
                    max(dp[q][q + w][e][e + r], dp[q + 1][q + w - 1][e][e + r]);
            }
            if (q + w >= q + 2 && e + r >= e + 2) {
              if (z[q][e] - 'a' == z[q + w - 1][e + r - 1] - 'A')
                dp[q][q + w][e][e + r] = max(
                    dp[q][q + w][e][e + r], dp[q + 1][q + w][e][e + r - 1] + 1);
              else
                dp[q][q + w][e][e + r] =
                    max(dp[q][q + w][e][e + r], dp[q + 1][q + w][e][e + r - 1]);
            }
            if (q + w >= q + 2 && e + r >= e + 2) {
              if (z[q][e] - 'a' == z[q + w - 1][e + r - 1] - 'A')
                dp[q][q + w][e][e + r] = max(
                    dp[q][q + w][e][e + r], dp[q][q + w - 1][e + 1][e + r] + 1);
              else
                dp[q][q + w][e][e + r] =
                    max(dp[q][q + w][e][e + r], dp[q][q + w - 1][e + 1][e + r]);
            }
            for (int t = q; t <= q + w; t++) {
              dp[q][w][e][r] =
                  max(dp[q][w][e][r], dp[q][t][e][r] + dp[t][w][e][r]);
            }
            for (int t = e; t <= e + r; t++) {
              dp[q][w][e][r] =
                  max(dp[q][w][e][r], dp[q][w][e][t] + dp[q][w][t][r]);
            }
            // printf("%d %d %d %d %d\\n",q,q+w,e,e+r,dp[q][q+w][e][e+r]);
          }

    // for(int q=0;q<=n;q++)

    printf("%d\\n", dp[0][n][0][m]);
  }
}