题目描述
算法思路
整体采用的仍然是动态规划的思想,首先定义变量
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])