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

#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;

typedef pair<int, int> P;

int main() {
  P p;
  vector<P> *List;
  int s, d, m, k, f, f1, f2, f3, **dp, outp, outc, cnt;
  while (scanf("%d %d %d", &s, &d, &m) != EOF) {
    outp = outc = cnt = 0;
    // メモリ確保と入力
    // メモリ確保
    List = new vector<P>[s];
    dp = new int *[d + 1];
    for (f1 = 0; f1 <= d; f1++) {
      dp[f1] = new int[m + 1];
    }
    // 入力
    for (f1 = 0; f1 < s; f1++) {
      scanf("%d", &k);
      for (f2 = 0; f2 < k; f2++) {
        scanf("%d %d", &p.first, &p.second);
        List[f1].push_back(p);
      }
    }
    // 動的計画法(DP)
    for (f1 = 0; f1 <= m; f1++)
      dp[0][f1] = 0;
    for (f1 = 1; f1 <= d; f1++) {
      scanf("%d", &f);
      if (f < s) {
        cnt++;
        // 内容をコピーする
        for (f3 = 0; f3 <= m; f3++)
          dp[f1][f3] = dp[f1 - 1][f3];
        // 初期
        for (f2 = 0; f2 < (int)List[f].size(); f2++) {
          p = List[f][f2];
          for (f3 = m - p.second; f3 >= 0; f3--) {
            int tmp = f3 + p.second;
            dp[f1][tmp] = (dp[f1][tmp] < dp[f1][f3] + p.first)
                              ? dp[f1][f3] + p.first
                              : dp[f1][tmp];
          }
        }
      }
    }
    for (f1 = 0; f1 <= m; f1++) {
      if (outp < dp[cnt][f1]) {
        outp = dp[cnt][f1];
        outc = f1;
      }
    }
    printf("%d %d\\n", outp, outc);
  }
  return 0;
}

Error: -11

Fixed submission:

#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;

typedef pair<int, int> P;

int main() {
  P p;
  vector<P> *List;
  int s, d, m, k, f, f1, f2, f3, **dp, outp, outc, cnt;
  while (scanf("%d %d %d", &s, &d, &m) != EOF) {
    outp = outc = cnt = 0;
    // メモリ確保と入力
    // メモリ確保
    List = new vector<P>[s];
    dp = new int *[d];
    for (f1 = 0; f1 < d; f1++) {
      dp[f1] = new int[m + 1];
    }
    // 入力
    for (f1 = 0; f1 < s; f1++) {
      scanf("%d", &k);
      for (f2 = 0; f2 < k; f2++) {
        scanf("%d %d", &p.first, &p.second);
        List[f1].push_back(p);
      }
    }
    // 動的計画法(DP)
    for (f1 = 0; f1 <= m; f1++)
      dp[0][f1] = 0;
    for (f1 = 0; f1 < d; f1++) {
      scanf("%d", &f);
      if (f <= s) {
        f--;
        cnt++;
        // 内容をコピーする
        if (f1 != 0) {
          for (f3 = 0; f3 <= m; f3++)
            dp[f1][f3] = dp[f1 - 1][f3];
        }
        // 初期
        for (f2 = 0; f2 < (int)List[f].size(); f2++) {
          p = List[f][f2];
          if (f1 == 0)
            dp[f1][p.second] =
                (dp[f1][p.second] < p.first) ? p.first : dp[f1][p.second];
          else {
            for (f3 = m - p.second; f3 >= 0; f3--) {
              if (dp[f1][f3] > 0 || f3 == 0) {
                int tmp = f3 + p.second;
                dp[f1][tmp] = (dp[f1][tmp] < dp[f1][f3] + p.first)
                                  ? dp[f1][f3] + p.first
                                  : dp[f1][tmp];
              }
            }
          }
        }
      }
    }
    for (f1 = 0; f1 <= m; f1++) {
      if (outp < dp[cnt - 1][f1]) {
        outp = dp[cnt - 1][f1];
        outc = f1;
      }
    }
    printf("%d %d\\n", outp, outc);
  }
  return 0;
}