小 K 打下的江山一共有 n个城市城市 i和城市 i+1有一条双向高速公路连接走这条路要耗费时间 ai。小 K 为了关心人民生活决定定期进行走访。他每一次会从 1号城市到 n号城市并在经过的城市进行访问。其中终点必须为城市n。不仅如此他还有一个传送器传送半径为 k也就是可以传送到 i-k和 i+k。如果目标城市编号小于 1则为 1大于 n则为 n。但是他的传送器电量不足只能传送一次况且由于一些原因
假设有一个大小为n的数组dp,其中dp[i]表示从城市1到城市i的最快时间。
首先,我们初始化dp数组,将所有元素的值都设为无穷大,表示不可达。
然后,我们从城市1开始遍历到城市n,对于每个城市i,我们需要计算dp[i]的值。
对于dp[i]的计算,我们有两种选择:
-
如果城市i可以通过传送器直接到达,即i-k大于等于1,我们可以使用传送器到达城市i,此时dp[i] = dp[i-k] + 传送器的花费。
-
如果城市i不可以通过传送器直接到达,即i-k小于1,我们只能通过高速公路一步步到达城市i,此时dp[i] = dp[i-1] + 高速公路的花费。
最后,dp[n]即为从城市1到城市n的最快时间。
以下是C++代码实现:
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> a(n+1);
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
vector<int> dp(n+1, INT_MAX);
dp[1] = 0;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= k && i-j >= 1; j++) {
dp[i] = min(dp[i], dp[i-j] + a[i]);
}
}
cout << dp[n] << endl;
return 0;
}
时间复杂度为O(n*k),其中n为城市数量,k为传送器的传送半径
原文地址: http://www.cveoy.top/t/topic/h3UG 著作权归作者所有。请勿转载和采集!