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

// g++ t.cpp -o t && t < p.txt
// d>p.txt&&t<p.txt&&t2<p.txt

#include <algorithm> // みんな大好きソートと二分探索
#include <bitset>
#include <ctime>
#include <functional> // 関数を変数に入れる子
#include <iostream>   // プログラムの耳と口
#include <map>        // setの妹 これまた優秀
#include <queue>      // きゅーちゃん、だいすき
#include <random>     // 乱択さん
#include <set>        // 値の取得・挿入・削除を高速に
#include <string>     // to_string
#include <vector>     // 超有能配列秘書

#define DB cerr << "D" << endl
using namespace std;
using ll = long long;
using ld = long double;
const int INF = 1e9;
const ll LINF = 1e18;
const double dINF = 1e18;
const ld ldINF = 1e18;
const double EPS = 1e-6;
template <typename T, typename U, typename O> void caut(T a, U b, O c) {
  cout << "(" << a << "," << b << "," << c << ") ";
}
template <typename T, typename U> void caut(T a, U b) {
  cout << "(" << a << "," << b << ") ";
}
template <typename T> void caut(T a) { cout << "(" << a << ") "; };
using P = pair<ll, ll>;
const ll M = 1e9 + 7;
ll mod_pow(ll x, ll a) {
  ll an = 1;
  while (a > 0) {
    if (a & 1)
      an = an * x % M;
    x = x * x % M;
    a >>= 1;
  }
  return an;
}
void add(ll &x, ll y) {
  x += y;
  x %= M;
};
void mul(ll &x, ll y) {
  x *= y;
  x %= M;
};
template <typename T, typename U> void chmax(T &x, U y) {
  if (x < y)
    x = y;
};
template <typename T, typename U> void chmin(T &x, U y) {
  if (x > y)
    x = y;
}
bool vaild(int x, int y, int hh, int ww) {
  return 0 <= x && x < hh && 0 <= y && y < ww;
}
int keta(ll a) {
  int res = 0;
  while (a > 0)
    res += a % 10, a /= 10;
  return res;
}
const int up[] = {1, -1, 0, 0}, lf[] = {0, 0, 1, -1};

int main() {
  int r, c, kk;
  cin >> r >> c >> kk;
  ll a[r][c];
  fill(a[0], a[r], 0);

  for (int i = 0; i < kk; i++) {
    ll f, g, h;
    cin >> f >> g >> h;
    f--;
    g--;
    a[f][g] = h;
  }
  /*
  for(int i=0;i<r;i++) {
    for(int j=0;j<c;j++) {
      cin>>a[i][j];
    }
  }*/

  ll dp[2][c][4];
  fill(dp[0][0], dp[2][0], -LINF);
  dp[0][0][0] = 0;
  dp[0][0][1] = a[0][0];

  for (int i = 0; i < r; i++) {
    int nw = i % 2, nx = (i + 1) % 2;
    for (int j = 0; j < c; j++) {
      for (int k = 0; k < 4; k++) {
        if (dp[nw][j][k] == -LINF)
          continue;
        chmax(dp[nx][j][0], dp[nw][j][k]); // 下の行に移る
        if (i + 1 < r) {
          chmax(dp[nx][j][1], dp[nw][j][k] + a[i + 1][j]); // 下の行に移る
        }
        if (j + 1 < c) {
          chmax(dp[nw][j + 1][k], dp[nw][j][k]); // 右に移る
          if (k + 1 < 4)
            chmax(dp[nw][j + 1][k + 1], dp[nw][j][k] + a[i][j + 1]);
        }
      }
    }
    /*
    cout<<i<<" : \\n";
    for(int j=0;j<c;j++) {
      cout<<dp[nw][j][0]<<" ";
    } cout<<endl;
    for(int j=0;j<c;j++) {
      cout<<dp[nx][j][0]<<" ";
    } cout<<endl;*/
    for (int j = 0; j < c; j++) {
      for (int k = 0; k < 4; k++) {
        dp[nw][j][k] = -LINF;
      }
    }
    fill(dp[nw][0], dp[nw + 1][0], -LINF);
  }

  /*
  for(int k=0;k<4;k++) {
    for(int i=0;i<r;i++) {
      for(int j=0;j<c;j++) {
        cout<<dp[i][j][k]<<" ";
      } cout<<endl;
    } cout<<endl;
  }*/

  ll an = 0;
  for (int i = 0; i < 4; i++) {
    an = max(an, dp[r % 2][c - 1][i]);
  }
  cout << an << endl;
}
// ・配列の大きさok？　・priority_queueはgreater？　・debug消した？
// ・落ち着いて。提出まで4分待ってね……WJ……1/10……2/10……

// Thank you for making problems and running the contest


Error: 0

Fixed submission:

// g++ t.cpp -o t && t < p.txt
// d>p.txt&&t<p.txt&&t2<p.txt

#include <algorithm> // みんな大好きソートと二分探索
#include <iostream>  // プログラムの耳と口
#include <random>    // 乱択さん

using namespace std;
using ll = long long;
const ll LINF = 1e18;
template <typename T, typename U> void chmax(T &x, U y) {
  if (x < y)
    x = y;
};
template <typename T, typename U> void chmin(T &x, U y) {
  if (x > y)
    x = y;
}

namespace r {
random_device rd;
mt19937 mt(rd());
int nd(int max) { return mt() % max + 1; }
int nd2(int min, int max) { return mt() % (max - min + 1) + min; }
} // namespace r

int main() {
  int r, c, kk;
  cin >> r >> c >> kk;
  ll a[r][c];
  fill(a[0], a[r], 0);
  for (int i = 0; i < kk; i++) {
    ll f, g, h;
    cin >> f >> g >> h;
    f--;
    g--;
    a[f][g] = h;
    // ll f,g,h; cin>>f>>g>>h; f--; g--;
    // ll f = r::nd(r) - 1;
    // ll g = r::nd(c) - 1;
    // ll h = r::nd(1000000000) - 1;
    // a[f][g] = h;
  }

  ll dp[r][c][4];
  fill(dp[0][0], dp[r][0], -LINF);
  dp[0][0][0] = 0;
  dp[0][0][1] = a[0][0];

  for (int i = 0; i < r; i++) {
    for (int j = 0; j < c; j++) {
      for (int k = 0; k < 4; k++) {
        if (i + 1 < r) {
          chmax(dp[i + 1][j][0], dp[i][j][k] + a[i + 1][j]); // 下の行に移る
        }
        if (j + 1 < c) {
          chmax(dp[i][j + 1][k], dp[i][j][k]); // 右に移る
          if (k + 1 < 4)
            chmax(dp[i][j + 1][k + 1], dp[i][j][k] + a[i][j + 1]);
        }
      }
    }
  }

  ll an = 0;
  for (int i = 0; i < 4; i++) {
    an = max(an, dp[r - 1][c - 1][i]);
  }
  cout << an << endl;
}
// ・配列の大きさok？　・priority_queueはgreater？　・debug消した？
// ・落ち着いて。提出まで4分待ってね……WJ……1/10……2/10……

// Thank you for making problems and running the contest