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

#include <algorithm>
#include <cstdio>
#include <math.h>
#include <string.h>
#include <vector>

using namespace std;
const int INF = 1001001001;
#define rep(i, n) for (int i = 0; i < n; i++)
int N, M;
int stonenum[152];
int C[152][12];
int G[152][12];
//[i][j]=i+1行目にある石j個目の C=列(位置)、G=滑りやすさ>
int dp[152][12][77];
//[i][j][k]=i行(0,N行は陸)j+1番目にある石にいて、今までにk(<M<=(150+1)/2)回
// 飛ばした時の、対岸までの最短距離

int main() {
  while (1) {
    scanf("%d %d", &N, &M);
    if (N == 0 && M == 0)
      break;
    rep(i, N) {
      int a = 0;
      scanf("%d", &a);
      stonenum[i] = a;
      rep(j, a) {
        int b, c;
        scanf("%d", &b);
        scanf("%d", &c);
        C[i][j] = b;
        G[i][j] = c;
      }
    }
    // printf("\\nyomikomiOK");
    for (int i = N; i > -1; i--) { // i=N…0
      rep(j, stonenum[i]) {
        rep(k, M + 1) {
          if (i == N - 1) {
            dp[i][j][k] = 0;
          } else if (i == N - 2 && k < M) { // 0距離
            dp[i][j][k] = 0;
          } else {
            int ans = INF;
            rep(m, stonenum[i + 1]) {
              // if(ans==INF)ans=((G[i][k]+G[i+1][m])*abs(C[i][k]-C[i+1][m])+dp[i+1][m][k]);
              ans = min(ans,
                        ((G[i][j] + G[i + 1][m]) * abs(C[i][j] - C[i + 1][m]) +
                         dp[i + 1][m][k]));
            }
            if (k < M) {
              rep(m, stonenum[i + 2]) {
                ans = min(ans,
                          (G[i][j] + G[i + 2][m]) * abs(C[i][j] - C[i + 2][m]) +
                              dp[i + 2][m][k + 1]);
              }
            }
            dp[i][j][k] = ans;
          }
        }
      }
    }
    int ans = INF;
    rep(i, stonenum[0]) ans = min(ans, dp[0][i][0]);
    if (M > 0)
      rep(i, stonenum[1]) ans = min(ans, dp[1][i][1]);
    printf("%d\\n", ans);
  }
  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <cstdio>
#include <math.h>
#include <string.h>
#include <vector>

using namespace std;
const int INF = 1001001001;
#define rep(i, n) for (int i = 0; i < n; i++)

int main() {
  while (1) {
    int N, M;
    int stonenum[152];
    int C[152][12];
    int G[152][12];
    //[i][j]=i+1行目にある石j個目の C=列(位置)、G=滑りやすさ>
    int dp[152][12][77];
    //[i][j][k]=i行(0,N行は陸)j+1番目にある石にいて、今までにk(<M<=(150+1)/2)回
    // 飛ばした時の、対岸までの最短距離
    scanf("%d %d", &N, &M);
    if (N == 0 && M == 0)
      break;
    rep(i, N) {
      int a = 0;
      scanf("%d", &a);
      stonenum[i] = a;
      rep(j, a) {
        int b, c;
        scanf("%d", &b);
        scanf("%d", &c);
        C[i][j] = b;
        G[i][j] = c;
      }
    }
    // printf("\\nyomikomiOK");
    for (int i = N; i > -1; i--) { // i=N…0
      rep(j, stonenum[i]) {
        rep(k, M + 1) {
          if (i == N - 1) {
            dp[i][j][k] = 0;
          } else if (i == N - 2 && k < M) { // 0距離
            dp[i][j][k] = 0;
          } else {
            int ans = INF;
            rep(m, stonenum[i + 1]) {
              // if(ans==INF)ans=((G[i][k]+G[i+1][m])*abs(C[i][k]-C[i+1][m])+dp[i+1][m][k]);
              ans = min(ans,
                        ((G[i][j] + G[i + 1][m]) * abs(C[i][j] - C[i + 1][m]) +
                         dp[i + 1][m][k]));
            }
            if (k < M) {
              rep(m, stonenum[i + 2]) {
                ans = min(ans,
                          (G[i][j] + G[i + 2][m]) * abs(C[i][j] - C[i + 2][m]) +
                              dp[i + 2][m][k + 1]);
              }
            }
            dp[i][j][k] = ans;
          }
        }
      }
    }
    int ans = INF;
    rep(i, stonenum[0]) ans = min(ans, dp[0][i][0]);
    if (M > 0)
      rep(i, stonenum[1]) ans = min(ans, dp[1][i][1]);
    printf("%d\\n", ans);
  }
  return 0;
}