Problem p03160 (C++)

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

using namespace std;

#define M_DEBUG if (1)

#define rep(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
#define reps(i, n) for (int i = 1, i##_len = (n); i <= i##_len; ++i)
#define rrep(i, n) for (int i = ((int)(n)-1); i >= 0; --i)
#define rreps(i, n) for (int i = ((int)(n)); i > 0; --i)
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
#define pb push_back
#define optimize_cin()                                                         \
  cin.tie(0);                                                                  \
  ios::sync_with_stdio(false)

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

using lint = long long;
typedef unsigned long long int ullint;

/******************************************************************************
        Main
******************************************************************************/
#define L_MAX_STEPS 10000

int main() {
  int n = 0;
  cin >> n;
  assert(n >= 2 && n <= pow(10, 5));

  int steps[L_MAX_STEPS] = {0}; // 第 i + 1 足場の高さ
  int costs[L_MAX_STEPS] = {0}; // 第 i + 1 足場までの最小コスト。
  rep(i, n) {
    cin >> steps[i];
    assert(steps[i] >= 1 && steps[i] <= pow(10, 4));
    if (i == 0)
      continue;
    // 0 - i までの最小コストを調べたい
    // i - 1 から飛んでくるのと、i - 2 から飛ぶのと、どっちがローコストか？
    int cost_best = abs(steps[i] - steps[i - 1]);
    if (i > 1) {
      cost_best += costs[i - 1];
      int cost = abs(steps[i] - steps[i - 2]);
      cost += costs[i - 2];
      cost_best = (cost_best > cost) ? cost : cost_best;
    }
    costs[i] = cost_best;
  }

  cout << costs[n - 1] << endl;

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>

using namespace std;

#define M_DEBUG if (1)

#define rep(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
#define reps(i, n) for (int i = 1, i##_len = (n); i <= i##_len; ++i)
#define rrep(i, n) for (int i = ((int)(n)-1); i >= 0; --i)
#define rreps(i, n) for (int i = ((int)(n)); i > 0; --i)
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
#define pb push_back
#define optimize_cin()                                                         \
  cin.tie(0);                                                                  \
  ios::sync_with_stdio(false)

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

using lint = long long;
typedef unsigned long long int ullint;

/******************************************************************************
        Main
******************************************************************************/
#define L_MAX_STEPS 100000

int main() {
  int n = 0;
  cin >> n;
  assert(n >= 2 && n <= pow(10, 5));

  int steps[L_MAX_STEPS] = {0}; // 第 i + 1 足場の高さ
  int costs[L_MAX_STEPS] = {0}; // 第 i + 1 足場までの最小コスト。
  rep(i, n) {
    cin >> steps[i];
    assert(steps[i] >= 1 && steps[i] <= pow(10, 4));
    if (i == 0)
      continue;
    // 0 - i までの最小コストを調べたい
    // i - 1 から飛んでくるのと、i - 2 から飛ぶのと、どっちがローコストか？
    int cost_best = abs(steps[i] - steps[i - 1]);
    if (i > 1) {
      cost_best += costs[i - 1];
      int cost = abs(steps[i] - steps[i - 2]);
      cost += costs[i - 2];
      cost_best = (cost_best > cost) ? cost : cost_best;
    }
    costs[i] = cost_best;
  }

  cout << costs[n - 1] << endl;

  return 0;
}