【蓝桥杯】【python】公交汽车

题目描述

在这里插入图片描述

算法思路

整体采用的仍然是动态规划的思想,首先定义变量

price[]: 共有11个值,第一个值为0,理解成原地踏步的费用,也就是不要钱,后面十个值分别是一次性走1~10公里需要的费用
dp[i]: dp数组,也就是代码的核心,下标i表示走i公里需要的最小费用数量

动态规划最重要的当然就是写出状态转移方程
分析可知:

dp[n] = dp[n - i] + dp[i]

可以理解成:
走n公里需要的最小费用 = 走n-i公里的最小费用 + 走i公里的费用

所以整体的状态转移方程为:

dp[n] = min{dp[n - j] + price[j], dp[n]}

转移方程中的j意指:0 < j < n,后面不能 <= n,因为如果等于n,那就等同于直接dp[n]

我踩过的坑

1.在令第一个价格为0的时候,对于数组的理解与常规代码中从0开始相矛盾。也就是代码中的i。

2.还有这个min(i + 1, 11),单纯看值应该是min(i, 10),但是因为for循环所以两个都要加一。

源代码

# main
price = [0]
temp = input().split()
for i in range(10):
    price.append(int(temp[i]))
mile = int(input())
dp = [0 for _ in range(mile + 1)]

# 动态规划
for i in range(1, mile + 1): # i 代表走i个车站
    dp[i] = 1000 # 首先将其预定义成为一个较大值
    for j in range(1, min(i + 1, 11)): 
        dp[i] = min(dp[i - j] + price[j], dp[i])

print(dp[mile])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值