秋招笔试题专栏——动态规划

52 阅读1分钟

最佳爬楼方案

题目

image.png

代码

#include <bits/stdc++.h>
#include <cstdint>

using namespace std;

int main() {
    int n, k;
    cin >> n >> k;
    vector<int> vec(n, 0);
    for(int i = 0; i < n; i++) cin >> vec[i];

    vector<int> dp(n, INT32_MAX);
    dp[0] = 0;
    for(int i = 1; i < n; i++) {
        for(int j = max(0, i - k); j < i; j++){
            dp[i] = min(dp[i], dp[j] + max(vec[i] - vec[j], 0));
        }
    }
    cout << dp[n-1] << endl;
}

思路:令dp[i]表示到达i位置所需花费的体力。每次选择既要考虑花费,也要考虑到距离,明显不是贪心策略可以解决的。则d[0] = 0,dp[i] = min(dp[i], dp[j] + max(0, v[i] - v[j))。并且i - j < k。由递推公式可以看出,遍历顺序应该是从小到大的。