最佳爬楼方案
题目
代码
#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
。由递推公式可以看出,遍历顺序应该是从小到大的。