补给站最优花费问题| 豆包MarsCode AI刷题

110 阅读3分钟

问题描述

小U计划进行一场从地点A到地点B的徒步旅行,总共需要 MMM 天。每天,小U需要消耗一份食物。在旅程中,她会经过一些补给站,每个补给站分布在不同的天数上,每个站的食物价格不同。小U希望以最低的成本购买足够的食物,以顺利完成旅行。

输入参数:

  1. MMM:总路程所需的天数。
  2. NNN:补给站的数量。
  3. ppp:一个包含补给站信息的列表,每个元素包含两个数字 AAA 和 BBB,表示第 AAA 天有一个补给站,食物价格为 BBB 元。

目标:找到在补给站购买食物的最佳策略,使得小U完成旅行的总花费最小。


解题思路

我们可以用动态规划的方法来解决这个问题。

定义状态

dp[i] 为到达第 iii 天所需的最小总花费。最终,我们想计算出 dp[M] 的值,即到达第 MMM 天的最小花费。

状态转移

我们遍历每一个补给站(在第 daydayday 天,价格为 pricepriceprice),然后根据这个补给站的食物价格,更新从 daydayday 开始到 MMM 天的花费。具体过程如下:

  1. 假设我们在第 daydayday 天补给站购买食物,我们可以从该天起满足未来几天的需求。

  2. 对于每一天 iii(从 daydayday 到 MMM),我们更新 dp[i] 为当前最小花费,即:

    • dp[i] = min(dp[i], dp[day] + (i - day) * price)
    • 其中,dp[day] 表示到达第 daydayday 天的总花费,(i - day) * price 表示从 daydayday 天购买的食物所需的花费。
  3. 每次遇到一个新的补给站时,我们从该站出发,更新从 day 到 MMM 天的最小花费。

初始条件

  • dp[0] = 0,表示起点的花费为0,因为第0天不需要购买食物。
  • dp[1]dp[M] 的初始值设为正无穷大,表示在没有任何补给计划时的默认花费(不可达状态)。

最终结果

遍历完所有补给站后,dp[M] 就是到达第 MMM 天的最小花费。如果 dp[M] 依然是正无穷大,表示小U无法完成整个行程。


算法复杂度

假设补给站数量为 NNN,总行程天数为 MMM,该算法的时间复杂度为 O(N×M)O(N \times M)O(N×M),因为我们需要遍历每个补给站并更新每天的花费。


示例讲解

示例 1

输入:M=5M = 5M=5,N=4N = 4N=4,补给站信息 p=[[0,2],[1,3],[2,1],[3,2]]p = [[0, 2], [1, 3], [2, 1], [3, 2]]p=[[0,2],[1,3],[2,1],[3,2]]。

解释:

  • 小U需要5天完成旅行,路上有4个补给站。
  • 我们会根据每个补给站的价格,从第0天开始计算每天的最低花费,直到第5天。

输出结果:7。

示例 2

输入:M=6M = 6M=6,N=5N = 5N=5,补给站信息 p=[[0,1],[1,5],[2,2],[3,4],[5,1]]p = [[0, 1], [1, 5], [2, 2], [3, 4], [5, 1]]p=[[0,1],[1,5],[2,2],[3,4],[5,1]]。

解释:

  • 小U需要6天完成旅行,路上有5个补给站。
  • 使用动态规划更新每一天的花费,最终得到最小总花费。

输出结果:6。