题目:补给站最优花费问题
问题描述
小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数组的索引
步骤:
- 遍历每天
- 遍历补给站描述p
- 当有补给站时,计算最小价格。(计算最小价格:①找到 p数组中,第 day天时,其对应的价格 并记录下来。②找最小值:判断第day天的价格 和 前几天的最小价格,哪个更小)
- 当没有补给站时,当天的价格为之前天中的最小价格。
图解
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
其他
感受,前端党现学python。 用了豆包ai更便于学习新语言。