B - Frog 2

B - Frog 2

キーワード

解説

問題 (opens in a new tab)

dpidp_i を次のように定義する。

足場 i+1i+1 に到達するために支払うコストの最小値

足場 11 からスタートするため、dp0=0dp_0 = 0 とする。

足場 ii への移動は、足場 i1,,iKi-1,\dots, i-KKK 通りがある。 ii へ行くのにかかる最小コストは、足場 i1,,iKi-1,\dots, i-K へ行くのにかかる最小コストに、それらから足場 ii へ行くためのコストを加えたものの最小値。

よって次のような漸化式が立てられる。

dpi=min(dpi1+hihi1,,dpiK+hihiK)dp_i = \min(dp_{i-1} + |h_i - h_{i-1}|, \dots, dp_{i-K} + |h_i - h_{i-K}|)

最終的な答えは dpN1dp_{N-1} となる。

計算量は、一回の遷移が O(K)\mathrm{O}(K) で行えるため、全体で O(KN)\mathrm{O}(KN) となる。

提出コード

int main() {
    int n, k; cin >> n >> k;
    vector<int> H(n); rep(i, 0, n) cin >> H[i];
    vector<int> dp(n, INT_MAX);
    dp[0] = 0;
    rep(i, 1, n) {
        int m = INT_MAX;
        rep(j,1,k+1) if (i-j >= 0) m = min(m, dp[i-j] + abs(H[i] - H[i-j]));
        dp[i] = m;
    }
    cout << dp[n-1] << endl;
}