Problem p02586 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <cctype>
#include <climits>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;

using ll = long long int;
using ii = pair<int, int>;
using vi = vector<ll>;
using vii = vector<ii>;
using vvi = vector<vi>;
using vvvi = vector<vvi>;

#define mp(a, b) make_pair(a, b)

const int MOD = 1000 * 1000 * 1000 + 7;

ll dp(int x, int y, int it, vvi const &mat, vvvi &marcaje) {
  if (y >= mat.size())
    return 0;
  else if (x >= mat[0].size())
    return 0;
  else if (marcaje[y][x][it] != -1)
    return marcaje[y][x][it];
  else {
    // No hay item, vamos para la derecha o para abajo
    if (mat[y][x] == 0) {
      ll s1 = dp(x + 1, y, it, mat, marcaje);
      ll s2 = dp(x, y + 1, 0, mat, marcaje);
      marcaje[y][x][it] = max(s1, s2);
      return marcaje[y][x][it];
    } else {
      // Podemos o coger el ítem o no cogerlo

      // Cogemos el item
      // Vamos hacia la derecha si podemos
      ll s1 = 0;
      if (it < 2)
        s1 = dp(x + 1, y, it + 1, mat, marcaje) + mat[y][x];

      // Vamos hacia abajo
      ll s2 = dp(x, y + 1, 0, mat, marcaje) + mat[y][x];

      // No lo cogemos
      ll s3 = dp(x + 1, y, it, mat, marcaje);
      ll s4 = dp(x, y + 1, 0, mat, marcaje);

      marcaje[y][x][it] = max({s1, s2, s3, s4});
      return marcaje[y][x][it];
    }
  }
}

int main() {
  int r, c, k;
  cin >> r >> c >> k;

  vvi mat(r, vi(c));

  for (int i = 0; i < k; ++i) {
    int fil, col, val;
    cin >> fil >> col >> val;
    mat[fil - 1][col - 1] = val;
  }

  vvvi marcaje(r, vvi(c, vi(4, -1)));
  cout << dp(0, 0, 0, mat, marcaje) << '\n';
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cctype>
#include <climits>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;

using ll = long long int;
using ii = pair<int, int>;
using vi = vector<ll>;
using vii = vector<ii>;
using vvi = vector<vi>;
using vvvi = vector<vvi>;

#define mp(a, b) make_pair(a, b)

const int MOD = 1000 * 1000 * 1000 + 7;

ll dp(int x, int y, int it, vvi const &mat, vvvi &marcaje) {
  if (y >= mat.size())
    return 0;
  else if (x >= mat[0].size())
    return 0;
  else if (marcaje[y][x][it] != -1)
    return marcaje[y][x][it];
  else {
    // No hay item, vamos para la derecha o para abajo
    if (mat[y][x] == 0) {
      ll s1 = dp(x + 1, y, it, mat, marcaje);
      ll s2 = dp(x, y + 1, 0, mat, marcaje);
      marcaje[y][x][it] = max(s1, s2);
      return marcaje[y][x][it];
    } else {
      // Podemos o coger el ítem o no cogerlo

      // Cogemos el item
      // Vamos hacia la derecha si podemos
      ll s1 = 0;
      if (it < 2)
        s1 = dp(x + 1, y, it + 1, mat, marcaje) + mat[y][x];

      // Vamos hacia abajo
      ll s2 = dp(x, y + 1, 0, mat, marcaje) + mat[y][x];

      // No lo cogemos
      ll s3 = dp(x + 1, y, it, mat, marcaje);
      ll s4 = dp(x, y + 1, 0, mat, marcaje);

      marcaje[y][x][it] = max({s1, s2, s3, s4});
      return marcaje[y][x][it];
    }
  }
}

int main() {
  cin.tie(NULL);
  ios_base::sync_with_stdio(false);
  int r, c, k;
  cin >> r >> c >> k;

  vvi mat(r, vi(c));

  for (int i = 0; i < k; ++i) {
    int fil, col, val;
    cin >> fil >> col >> val;
    mat[fil - 1][col - 1] = val;
  }

  vvvi marcaje(r, vvi(c, vi(4, -1)));
  cout << dp(0, 0, 0, mat, marcaje) << '\n';
  return 0;
}