けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

鉄則本 A16 - Dungeon 1 (4Q, ★2)

Frog 1 とほぼ同じ問題!

問題概要

あるダンジョンには  N 個の部屋があり、 1, 2, \dots, N と番号がついている。このダンジョンは一方通行であり、通路を介して 1 つ先または 2 つ先の部屋に移動することができる。各通路における移動時間は以下の通り。

  • 部屋  i-1 から部屋  i A_{i}
  • 部屋  i-2 から部屋  i B_{i}

太郎君が部屋 1 から部屋  N に移動するのに、最短何分かかるか。

制約

  •  3 \le N \le 10^{5}

メモ

DP の入門問題。鉄則本の問題なので、解説は鉄則本を参照。

コード

#include <bits/stdc++.h>
using namespace std;
const int INF = 1<<30;

int main() {
    int N;
    cin >> N;
    vector<int> A(N), B(N);
    for (int i = 1; i < N; i++) cin >> A[i];
    for (int i = 2; i < N; i++) cin >> B[i];

    vector<int> dp(N, INF);
    dp[0] = 0;
    for (int i = 0; i < N; i++) {
        if (i-1 >= 0) dp[i] = min(dp[i], dp[i-1] + A[i]);
        if (i-2 >= 0) dp[i] = min(dp[i], dp[i-2] + B[i]);
    }
    cout << dp[N-1] << endl;
}