Problem p00473 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef unsigned __int128 HASH;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pullull;
typedef pair<ll, int> plli;
typedef pair<double, int> pdbi;
typedef pair<int, pii> pipii;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vi> vvi;
typedef vector<vvi> vvvi;
typedef vector<pii> vpii;
typedef vector<vector<int>> mat;

#define rep(i, n) for (int i = 0; i < (n); i++)
#define rep2(i, a, b) for (int i = (a); i < (b); i++)
#define rrep(i, n) for (int i = (n); i > 0; i--)
#define rrep2(i, a, b) for (int i = (a); i > b; i--)
#define pb push_back
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()

const ll hmod1 = 999999937;
const ll hmod2 = 1000000000 + 9;
const ll INF = 1 << 30;
const ll mod = 10000;
const int dx4[4] = {1, 0, -1, 0};
const int dy4[4] = {0, 1, 0, -1};
const int dx8[8] = {1, 1, 1, 0, 0, -1, -1, -1};
const int dy8[8] = {0, 1, -1, 1, -1, 0, 1, -1};
const double pi = 3.141592653589793;

// #define int long long
#define addm(X, Y) ((X) = ((X) + (Y) % mod) % mod)

int n;
int a[10000 + 5];
ll dp[2][505][2][2];

signed main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> n;
  rep(i, n - 1) cin >> a[i];
  int cur = 1, pre = 0;
  rep(i, n) {
    rep(j, n / 2 + 1) rep(k, 2) rep(l, 2) dp[cur][j][k][l] = INF;
    rep(j, min(n / 2 + 1, i + 2)) {
      if (j == i + 1) {
        dp[cur][i + 1][0][0] = 0;
        dp[cur][i + 1][0][1] = a[i];
      } else if (j == 0) {
        dp[cur][0][1][0] = 0;
        dp[cur][0][1][1] = a[i];
      } else {
        dp[cur][j][0][0] = min(dp[pre][j - 1][0][0], dp[pre][j - 1][1][1]);
        dp[cur][j][0][1] = dp[cur][j][0][0] + a[i];
        dp[cur][j][1][0] = min(dp[pre][j][0][1], dp[pre][j][1][0]);
        dp[cur][j][1][1] = dp[cur][j][1][0] + a[i];
      }
    }
    swap(cur, pre);
  }
  cout << min(dp[pre][n / 2][0][0], dp[pre][n / 2][1][0]) << endl;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef unsigned __int128 HASH;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pullull;
typedef pair<ll, int> plli;
typedef pair<double, int> pdbi;
typedef pair<int, pii> pipii;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vi> vvi;
typedef vector<vvi> vvvi;
typedef vector<pii> vpii;
typedef vector<vector<int>> mat;

#define rep(i, n) for (int i = 0; i < (n); i++)
#define rep2(i, a, b) for (int i = (a); i < (b); i++)
#define rrep(i, n) for (int i = (n); i > 0; i--)
#define rrep2(i, a, b) for (int i = (a); i > b; i--)
#define pb push_back
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()

const ll hmod1 = 999999937;
const ll hmod2 = 1000000000 + 9;
const ll INF = 1 << 30;
const ll mod = 10000;
const int dx4[4] = {1, 0, -1, 0};
const int dy4[4] = {0, 1, 0, -1};
const int dx8[8] = {1, 1, 1, 0, 0, -1, -1, -1};
const int dy8[8] = {0, 1, -1, 1, -1, 0, 1, -1};
const double pi = 3.141592653589793;

// #define int long long
#define addm(X, Y) ((X) = ((X) + (Y) % mod) % mod)

int n;
int a[10000 + 5];
ll dp[2][5005][2][2];

signed main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> n;
  rep(i, n - 1) cin >> a[i];
  int cur = 1, pre = 0;
  rep(i, n) {
    rep(j, n / 2 + 1) rep(k, 2) rep(l, 2) dp[cur][j][k][l] = INF;
    rep(j, min(n / 2 + 1, i + 2)) {
      if (j == i + 1) {
        dp[cur][i + 1][0][0] = 0;
        dp[cur][i + 1][0][1] = a[i];
      } else if (j == 0) {
        dp[cur][0][1][0] = 0;
        dp[cur][0][1][1] = a[i];
      } else {
        dp[cur][j][0][0] = min(dp[pre][j - 1][0][0], dp[pre][j - 1][1][1]);
        dp[cur][j][0][1] = dp[cur][j][0][0] + a[i];
        dp[cur][j][1][0] = min(dp[pre][j][0][1], dp[pre][j][1][0]);
        dp[cur][j][1][1] = dp[cur][j][1][0] + a[i];
      }
    }
    swap(cur, pre);
  }
  cout << min(dp[pre][n / 2][0][0], dp[pre][n / 2][1][0]) << endl;
}