Problem p02586 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < n; i++)
#define all(x) (x).begin(), (x).end()    // 昇順ソート
#define rall(v) (v).rbegin(), (v).rend() // 降順ソート
#define INF 1LL << 60
typedef long long int LL;
typedef long long int ll;
#define pll pair<ll, ll>
#define F first
#define S second
const int MOD = 1000000007;
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
// 任意のlogは　対数の底の変換を使う    log(N) / log(任意の底)

LL dp[3100][3100][5];
LL it[3100][3100];

int main() {
  LL R, C, K;
  cin >> R >> C >> K;
  vector<LL> r(K);
  vector<LL> c(K);
  vector<LL> v(K);
  rep(i, K) {
    int rr, cc, vv;
    cin >> rr >> cc >> vv;
    rr--;
    cc--;
    r[i] = rr;
    c[i] = cc;
    v[i] = vv;
  }

  memset(it, 0, sizeof(it));

  rep(i, K) it[r[i]][c[i]] = v[i];

  memset(dp, 0, sizeof(dp));

  rep(i, R) {
    rep(j, C) {
      if (i == 0 && j == 0) {
        chmax(dp[0][0][1], it[0][0]);
      }
      for (int k = 0; k <= 3; k++) {
        if (i != R - 1) {
          chmax(dp[i + 1][j][0], dp[i][j][k]); // 拾わないで下
          chmax(dp[i + 1][j][1], dp[i][j][k] + it[i + 1][j]); // 拾って下
        }
        if (j != C - 1) {
          chmax(dp[i][j + 1][k], dp[i][j][k]); // 拾わないで右
          if (k != 3)
            chmax(dp[i][j + 1][k + 1], dp[i][j][k] + it[i][j + 1]); // 拾って右
        }
      }
    }
  }

  LL ans = 0;

  rep(i, 4) chmax(ans, dp[R - 1][C - 1][i]);

  cout << ans << endl;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < n; i++)
#define all(x) (x).begin(), (x).end()    // 昇順ソート
#define rall(v) (v).rbegin(), (v).rend() // 降順ソート
#define INF 1LL << 60
typedef long long int LL;
typedef long long int ll;
#define pll pair<ll, ll>
#define F first
#define S second
const int MOD = 1000000007;
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
// 任意のlogは　対数の底の変換を使う    log(N) / log(任意の底)

LL dp[3100][3100][5];

int main() {
  LL R, C, K;
  cin >> R >> C >> K;
  vector<LL> r(K);
  vector<LL> c(K);
  vector<LL> v(K);
  rep(i, K) {
    int rr, cc, vv;
    cin >> rr >> cc >> vv;
    rr--;
    cc--;
    r[i] = rr;
    c[i] = cc;
    v[i] = vv;
  }

  map<pair<LL, LL>, LL> m;
  rep(i, K) m[{r[i], c[i]}] = v[i];

  memset(dp, 0, sizeof(dp));
  rep(i, R + 5) rep(j, C + 5) rep(k, 4) dp[i][j][k] = 0;

  rep(i, R) {
    rep(j, C) {
      if (i == 0 && j == 0) {
        chmax(dp[0][0][1], m[{0, 0}]);
      }
      for (int k = 0; k <= 3; k++) {
        if (i != R - 1) {
          chmax(dp[i + 1][j][0], dp[i][j][k]); // 拾わないで下
          chmax(dp[i + 1][j][1], dp[i][j][k] + m[{i + 1, j}]); // 拾って下
        }
        if (j != C - 1) {
          chmax(dp[i][j + 1][k], dp[i][j][k]); // 拾わないで右
          if (k != 3)
            chmax(dp[i][j + 1][k + 1], dp[i][j][k] + m[{i, j + 1}]); // 拾って右
        }
      }
    }
  }

  LL ans = 0;

  rep(i, 4) chmax(ans, dp[R - 1][C - 1][i]);

  cout << ans << endl;
}