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

236 阅读4分钟

题目:补给站最优花费问题

问题描述

小U计划进行一场从地点A到地点B的徒步旅行,旅行总共需要 M 天。为了在旅途中确保安全,小U每天都需要消耗一份食物。在路程中,小U会经过一些补给站,这些补给站分布在不同的天数上,且每个补给站的食物价格各不相同。

小U需要在这些补给站中购买食物,以确保每天都有足够的食物。现在她想知道,如何规划在不同补给站的购买策略,以使她能够花费最少的钱顺利完成这次旅行。

  • M:总路程所需的天数。
  • N:路上补给站的数量。
  • p:每个补给站的描述,包含两个数字 A 和 B,表示第 A 天有一个补给站,并且该站每份食物的价格为 B 元。

保证第0天一定有一个补给站,并且补给站是按顺序出现的。


测试样例

样例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


思路

动态规划问题

思路:遍历每一天,遍历补给站描述数组。①若到达有补给站的那天,判断当天价格与之前的每天价格的大小,选择最小的值作为当日食物费用;②没有补给站的那天,将之前最小的价格作为当天的食物费用。

注意:

  • 第day天数 ≠ p数组的索引

步骤:

  1. 遍历每天
  2. 遍历补给站描述p
  3. 当有补给站时,计算最小价格。(计算最小价格:①找到 p数组中,第 day天时,其对应的价格 并记录下来。②找最小值:判断第day天的价格 和 前几天的最小价格,哪个更小)
  4. 当没有补给站时,当天的价格为之前天中的最小价格。

图解

e3e280aa77b22803502dd3d9b9cdf26.jpg ps:图解为自己整理的题目信息,以作为参考,有不懂地方欢迎提问。

代码详解-Python语言

def solution(m: int, n: int, p: list[list[int]]) -> int:
    # 动态规划问题(dp)
    # 思路:遍历每一天,若到达有补给站的那天,判断当天与之前的每天价格的大小,选择最小的值作为当日食物费用。
    # 定义最小成本 和 当前最小成本
    min_cost = 0
    min_now = p[0][1]  # 让当前的最小值等于第0天的价格
    
    # 遍历每一天
    for day in range(m):
        # 遍历每一个补给站描述
        # 当有补给站时,计算最小价格
        if day in [station[0] for station in p]:   # day是二元数组p中的第一个数组中的第一个数字,代表第几天
            
            # 找到 p数组中,第 day天时,其对应的价格 并记录下来
            for station in p:
                if station[0] == day:
                    result = station[1]

            # 找最小值:判断第day天的价格 和 前几天的最小价格,哪个更小
            min_now = min(min_now, result) 
            min_cost += min_now
            
        # 当没有补给站时,令该天食物价格为之前的最小值
        else:
            min_cost += min_now
    return min_cost

if __name__ == "__main__":
    print(solution(5, 4, [[0, 2], [1, 3], [2, 1], [3, 2]]) == 7)
    print(solution(6 ,5 , [[0, 1], [1, 5], [2, 2], [3, 4], [5, 1]])) 
    print(solution(4 , 3 ,[[0, 3], [2, 2], [3, 1]]) ) 

知识点总结-python

if循环:

if day in [station[0] for station in p]

遍历二元数组p 数组中的每项,找到每项的第一个数,如 p[a][b]中的a

python中的 if 语法if 临时变量 in 待处理数据集:

for循环:

for day in range(m): 遍历 从0到m(不含m)

for d in range(m,n): 遍历 从m到n(不含n)

for d in range(m,n,t): 遍历 从m到n(不含n),步长为t

总结:range(m,n,t),后两项可选,仅一项 m表示 0-(m-1);仅两项表示m-(n-1);仅三项表示m-(n-1),步长为t

二元数组写法:

p: list[list[int]] ,即表示 p[ ][ ],为整型

python

python具有严格的缩进格式


疑惑点

目标:找到 p数组中,第 day天时,其对应的价格 并记录下来

            for station in p:
                if station[0] == day:
                    result = station[1]

除了上述写法,还可以怎么写?

下面这句为什么不可以,如果要写成一行该怎么写,有没有哪位题友可以帮忙解答一下

            station[1] for station in p if station[0] == day 

45a6a40a103b6ba771e4948ddd9909a.png

其他

感受,前端党现学python。 用了豆包ai更便于学习新语言。