问题描述
小R正在计划一次从地点A到地点B的徒步旅行,总路程需要 N
天。为了在旅途中保持充足的能量,小R每天必须消耗1份食物。幸运的是,小R在路途中每天都会经过一个补给站,可以先购买完食物后再消耗今天的1份食物。然而,每个补给站的食物每份的价格可能不同,并且小R在购买完食物后最多只能同时携带 K
份食物。
现在,小R希望在保证每天食物消耗的前提下,以最小的花费完成这次徒步旅行。你能帮助小R计算出最低的花费是多少吗?
输入
n
总路程需要的天数k
小R最多能同时携带食物的份数data[i]
第i天补给站每份食物的价格
输出
- 返回完成这次徒步旅行的最小花费
约束条件
1
<n,k
<1000
1
<data[i]
<10000
public static int solution(int n, int k, int[] data) {
// 获取数组长度(表示天数)
int length = data.length;
// 创建dp数组,dp[i]表示到第i天为止的最小花费(食物刚好吃完)
int[] dp = new int[length];
// 初始化第一天的花费,必须购买一份食物
dp[0] = data[0];
// 从第2天开始迭代计算最小花费
for (int i = 1; i < length; i++) {
// 情况1:直接买当天的食物
dp[i] = dp[i - 1] + data[i];
// 情况2:尝试使用之前购买的库存食物
for (int j = i - 1; j >= i - k + 1 && j >= 0; j--) {
// 尝试从过去的j天购买食物并携带到今天消耗,更新最小花费
dp[i] = Math.min(dp[i], dp[j] + data[j]);
}
}
// 返回到最后一天时的最小花费
return dp[length - 1];
}