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

#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

#define EPS (1e-10)
#define EQ(a, b) (abs((a) - (b)) < EPS)
#define EQV(a, b) (EQ((a).real(), (b).real()) && EQ((a).imag(), (b).imag()))

typedef complex<double> P;
typedef pair<P, P> Edge;
typedef long long ll;

const double PI = 4 * atan(1.0);

// #define RED_FILE

#ifdef RED_FILE
ifstream ifs("input.txt");
ofstream ofs("output.txt");
#define cin ifs
#define cout ofs
#endif

int dp[101][321];

int main() {

  int t;
  cin >> t;
  while (t--) {
    memset(dp, 0, sizeof(dp));
    int n;
    cin >> n;
    int a[101];
    for (int i = 0; i < n; i++)
      cin >> a[i];
    if (n == 1) {
      cout << a[0] << endl;
      continue;
    }
    dp[0][a[0]] = a[1];
    for (int i = 1; i < n - 1; i++) {
      for (int j = 0; j < 321; j++) {
        // ツ遷ツ暗堋つウツつケツづゥ
        if (dp[i - 1][j] - 1 >= 0)
          dp[i][dp[i - 1][j] - 1] = max(dp[i][dp[i - 1][j] - 1], j + a[i + 1]);
        // ツ遷ツ暗堋つウツつケツづ按つ「
        dp[i][dp[i - 1][j]] = max(dp[i][dp[i - 1][j]], a[i + 1]);
      }
    }
    int maxNum = 0;
    for (int i = 0; i < 321; i++) {
      maxNum = max(dp[n - 2][i], maxNum);
    }

    cout << maxNum << endl;
  }
  return 0;
}

Error: WA

Fixed submission:


#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

#define EPS (1e-10)
#define EQ(a, b) (abs((a) - (b)) < EPS)
#define EQV(a, b) (EQ((a).real(), (b).real()) && EQ((a).imag(), (b).imag()))

typedef complex<double> P;
typedef pair<P, P> Edge;
typedef long long ll;

const double PI = 4 * atan(1.0);

#define RED_FILE

#ifdef RED_FILE
ifstream ifs("input.txt");
ofstream ofs("output.txt");
#define cin ifs
#define cout ofs
#endif

// dp[idx][prv]idxÜÅÅidx-1ÌlªprvÌÆ«ìêéÅåÌcurÌl
int dp[101][321];

int main() {

  int t;
  cin >> t;
  while (t--) {
    memset(dp, 0, sizeof(dp));
    int n;
    cin >> n;
    int a[101];
    for (int i = 0; i < n; i++)
      cin >> a[i];
    if (n == 1) {
      cout << a[0] << endl;
      continue;
    }
    dp[0][a[0]] = a[1];
    for (int i = 1; i < n - 1; i++) {
      for (int j = 0; j < 321; j++) {
        // JÚ³¹é
        if (dp[i - 1][j] - 1 >= 0)
          dp[i][dp[i - 1][j] - 1] = max(dp[i][dp[i - 1][j] - 1], j + a[i + 1]);
        // JÚ³¹È¢
        dp[i][dp[i - 1][j]] = max(dp[i][dp[i - 1][j]], a[i + 1]);
      }
    }
    int maxNum = 0;
    for (int i = 0; i < 321; i++) {
      maxNum = max(dp[n - 2][i], maxNum);
    }
    // for(int i = 0; i < 321; i++){
    //     for(int j = 0; j <321; j++){
    //         if(dp[n-2][i][j]){
    //             maxNum=max(maxNum,j);
    //         }
    //     }
    // }
    cout << maxNum << endl;
  }
  return 0;
}

// bool dp[101][321][321];
//
// int main(){
//
//     int t;
//     cin>>t;
//     while(t--){
//         memset(dp,0,sizeof(dp));
//         int n;
//         cin>>n;
//         int a[101];
//         for(int i = 0; i < n; i++)
//             cin>>a[i];
//         if(n==1){
//             cout<<a[0]<<endl;
//             continue;
//         }
//         dp[0][a[0]][a[1]]=true;
//         for(int i = 1; i < n-1; i++){
//             for(int j = 0; j < 321; j++){
//                 for(int k = 0; k < 321; k++){
//                     if(dp[i-1][j][k]){
//                         if(k-1>=0)
//                             dp[i][k-1][j+a[i+1]]=true;
//                         dp[i][k][a[i+1]]=true;
//                     }
//                 }
//             }
//         }
//         int maxNum=0;
//         for(int i = 0; i < 321; i++){
//             for(int j = 0; j <321; j++){
//                 if(dp[n-2][i][j]){
//                     maxNum=max(maxNum,j);
//                 }
//             }
//         }
//         cout<<maxNum<<endl;
//     }
//
//     return 0;
// }