题目:
小R正在计划一次从地点A到地点B的徒步旅行,总路程需要 N 天。为了在旅途中保持充足的能量,小R每天必须消耗1份食物。幸运的是,小R在路途中每天都会经过一个补给站,可以先购买完食物后再消耗今天的1份食物。然而,每个补给站的食物每份的价格可能不同,并且小R在购买完食物后最多只能同时携带 K 份食物。
现在,小R希望在保证每天食物消耗的前提下,以最小的花费完成这次徒步旅行。你能帮助小R计算出最低的花费是多少吗?
思路:求到第N天的购粮消耗最优解=》求到第i天的购粮消耗最优解=》列出到第i天购粮消耗普适表达式:dp[i] = dp[i - 1] + data[i];=》优化到第i天购粮消耗表达式,可知只需优化data[i],即第i天的购粮消耗=>第i天的购粮消耗最优值应为自第i天起往前数k天内的购粮消耗最优值;
思路转折点:在粮价低的时候肯定要一次购入往后最多K天的粮食,以图总价最低,其实就是某天的最低价=往前数k天内的最低价(面向过程=》面向对象思考问题)
代码:
function solution(n, k, data) {
const len = data.length;
const dp = new Array(len).fill(0);
dp[0] = data[0];
for (let i = 1; i < len; i++) {
// 先按照一种可能不是最优的情况初始化dp[i]
dp[i] = dp[i - 1] + data[i];
for (let j = i - 1; j >= Math.max(i - k + 1, 0); j--) {
// 优化dp[i]
dp[i] = Math.min(dp[i], dp[i - 1] + data[j]);
}
}
return dp[len - 1];
}
function main() {
// 测试样例
console.log(solution(5, 2, [1, 2, 3, 3, 2]) == 9); // true
console.log(solution(6, 3, [4, 1, 5, 2, 1, 3]) == 9); // true
console.log(solution(4, 1, [3, 2, 4, 1]) == 10); // true
}
main();