Problem p04009 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>

#define x first
#define y second

using namespace std;

typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> ii;
typedef pair<ll, ll> pll;

int dp[2][101][101][101];
int H, W;
string bd[100];
int ei, ej;
int cs[2][101][101];

int main() {
  cin >> H >> W;
  for (int i = 0; i < H; i++)
    cin >> bd[i];
  for (int i = 0; i < H; i++)
    for (int j = 0; j < W; j++) {
      if (bd[i][j] == 'E') {
        ei = i;
        ej = j;
      } else if (bd[i][j] == 'o') {
        cs[0][i][j + 1]++;
        cs[1][i + 1][j]++;
      }
      cs[0][i][j + 1] += cs[0][i][j];
      cs[1][i + 1][j] += cs[1][i][j];
    }
  int p = 0;
  for (int i = H; i >= 0; i--, p = 1 - p)
    for (int j = H - i; j >= 0; j--)
      for (int k = W; k >= 0; k--)
        for (int l = W - k; l >= 0; l--) {
          if (i + j == H || k + l == W) {
            dp[p][j][k][l] = 0;
            continue;
          }

          int &r = dp[p][j][k][l];
          int t = 0;
          if (ei + i + 1 < H - j) {
            int lb = max(k, ej - l), ub = min(W - l, ej + k + 1);
            if (lb < ub)
              t += cs[0][ei + i + 1][ub] - cs[0][ei + i + 1][lb];
          }
          t += dp[1 - p][j][k][l];
          r = t;

          t = 0;
          if (ei - j - 1 >= i) {
            int lb = max(k, ej - l), ub = min(W - l, ej + k + 1);
            if (lb < ub)
              t += cs[0][ei - j - 1][ub] - cs[0][ei - j - 1][lb];
          }
          t += dp[p][j + 1][k][l];
          if (t > r)
            r = t;

          t = 0;
          if (ej + k + 1 < W - l)
            for (int c = max(i, ei - j); c < min(H - j, ei + i + 1); c++)
              if (bd[c][ej + k + 1] == 'o')
                t++;
          t += dp[p][j][k + 1][l];
          if (t > r)
            r = t;

          t = 0;
          if (ej - l - 1 >= k)
            for (int c = max(i, ei - j); c < min(H - j, ei + i + 1); c++)
              if (bd[c][ej - l - 1] == 'o')
                t++;
          t += dp[p][j][k][l + 1];
          if (t > r)
            r = t;
        }

  cout << dp[1 - p][0][0][0] << endl;
}

Fixed submission:
#include <bits/stdc++.h>

#define x first
#define y second

using namespace std;

typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> ii;
typedef pair<ll, ll> pll;

int dp[2][101][101][101];
int H, W;
string bd[100];
int ei, ej;
int cs[2][101][101];

int main() {
  cin >> H >> W;
  for (int i = 0; i < H; i++)
    cin >> bd[i];
  for (int i = 0; i < H; i++)
    for (int j = 0; j < W; j++) {
      if (bd[i][j] == 'E') {
        ei = i;
        ej = j;
      } else if (bd[i][j] == 'o') {
        cs[0][i][j + 1]++;
        cs[1][i + 1][j]++;
      }
      cs[0][i][j + 1] += cs[0][i][j];
      cs[1][i + 1][j] += cs[1][i][j];
    }
  int p = 0;
  for (int i = H; i >= 0; i--, p = 1 - p)
    for (int j = H - i; j >= 0; j--)
      for (int k = W; k >= 0; k--)
        for (int l = W - k; l >= 0; l--) {
          if (i + j == H || k + l == W) {
            dp[p][j][k][l] = 0;
            continue;
          }

          int &r = dp[p][j][k][l];
          int t = 0;
          if (ei + i + 1 < H - j) {
            int lb = max(k, ej - l), ub = min(W - l, ej + k + 1);
            if (lb < ub)
              t += cs[0][ei + i + 1][ub] - cs[0][ei + i + 1][lb];
          }
          t += dp[1 - p][j][k][l];
          r = t;

          t = 0;
          if (ei - j - 1 >= i) {
            int lb = max(k, ej - l), ub = min(W - l, ej + k + 1);
            if (lb < ub)
              t += cs[0][ei - j - 1][ub] - cs[0][ei - j - 1][lb];
          }
          t += dp[p][j + 1][k][l];
          if (t > r)
            r = t;

          t = 0;
          if (ej + k + 1 < W - l) {
            int lb = max(i, ei - j), ub = min(H - j, ei + i + 1);
            if (lb < ub)
              t += cs[1][ub][ej + k + 1] - cs[1][lb][ej + k + 1];
          }
          t += dp[p][j][k + 1][l];
          if (t > r)
            r = t;

          t = 0;
          if (ej - l - 1 >= k)
            for (int c = max(i, ei - j); c < min(H - j, ei + i + 1); c++)
              if (bd[c][ej - l - 1] == 'o')
                t++;
          t += dp[p][j][k][l + 1];
          if (t > r)
            r = t;
        }

  cout << dp[1 - p][0][0][0] << endl;
}