徒步旅行最小花费问题| 豆包MarsCode AI 刷题

114 阅读2分钟

这个问题是一个典型的动态规划问题,目的是通过在合适的补给站购买食物,确保每天都有食物并且花费最少。我们可以用动态规划来解决这个问题。

解题思路 我们需要建立一个数组 dp,其中 dp[i] 表示到达第 i 天时所需的最少花费。我们根据每一天的补给站和食物价格来更新这个数组。

初始化:从第0天开始,我们有一个补给站,所需的食物费用为 p[0][1]。

动态规划转移:

对于每一天 i,如果在第 i 天有补给站,那么我们可以选择从之前的某一天购买食物,更新最少花费。 比如,假设 p[j] 表示第 j 天的补给站,在第 j 天购买食物,并且我们可以用这个补给站购买食物直到第 i 天。 于是我们可以推导出:dp[i] = min(dp[i], dp[j] + (i - j) * p[j][1]),其中 dp[j] 是前一阶段的最小花费,(i - j) * p[j][1] 是从 j 到 i 这段时间所需的食物费用。 最终结果:dp[m-1] 就是我们需要的最小花费。

代码实现 def min_cost(m, n, p): # dp[i]表示到达第i天的最少花费 dp = [float('inf')] * m dp[0] = p[0][1] # 第0天的补给站价格

for i in range(1, m):
    for j in range(i + 1):
        # 检查第j天是否有补给站
        for k in range(n):
            if p[k][0] == j:
                dp[i] = min(dp[i], dp[j] + (i - j) * p[k][1])

return dp[m-1]

测试样例

print(min_cost(5, 4, [[0, 2], [1, 3], [2, 1], [3, 2]])) # 7 print(min_cost(6, 5, [[0, 1], [1, 5], [2, 2], [3, 4], [5, 1]])) # 6 print(min_cost(4, 3, [[0, 3], [2, 2], [3, 1]])) # 9 解释 dp[i] 表示到达第 i 天的最小花费。 对于每个补给站,我们会在不同的天数尝试最优策略,通过动态更新 dp 数组来记录最少的花费。 最终输出 dp[m-1],即到达最后一天所需的最少费用。 测试用例 样例1: 输入:m = 5 ,n = 4 ,p = [[0, 2], [1, 3], [2, 1], [3, 2]] 输出:7

样例2: 输入:m = 6 ,n = 5 ,p = [[0, 1], [1, 5], [2, 2], [3, 4], [5, 1]] 输出:6

样例3: 输入:m = 4 ,n = 3 ,p = [[0, 3], [2, 2], [3, 1]] 输出:9

进一步优化 当前的解法时间复杂度是 O(m * n^2),对于 n 和 m 较大的情况下,可能不够高效。可以通过更多的优化技巧来降低复杂度,例如使用动态规划+单调队列优化。