【动态规划】徒步旅行物资规划问题

117 阅读2分钟

题目:

小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();