动态规划——爬楼梯2
使用最小花费爬楼梯
题目描述:
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
- 确定dp数组以及下标的含义
dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]。
2.确定递推公式
dp[i - 1]花费 dp[i - 1] + cost[i - 1]跳到dp[i]
dp[i - 2] 花费 dp[i - 2] + cost[i - 2]跳到 dp[i]
选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
3.dp数组如何初始化
dp[i]由dp[i - 1],dp[i - 2]推出,
既然初始化所有的dp[i]是不可能的,
那么只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]dp[1]推出。
根据dp数组的定义,到达第0台阶所花费的最小体力为dp[0],那dp[0] 应该是 cost[0],例如 cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] 的话,dp[0] 就是 cost[0] 应该是1。
题目描述中明确说了 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。” 也就是说 到达 第 0 个台阶是不花费的,但从 第0 个台阶 往上跳的话,需要花费 cost[0]。
所以初始化 dp[0] = 0,dp[1] = 0;
4.确定遍历顺序
因为是模拟台阶,而且dp[i]由dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组就可以了。
5.举例推导dp数组
如果大家代码写出来有问题,就把dp数组打印出来,看看和如上推导的是不是一样的。
# 输入楼梯的费用
n = int(input("请输入楼梯的级数:"))
cost = [0] * n # 初始化cost数组
# 输入每个台阶的费用
for i in range(n):
cost[i] = int(input(f"请输入第{i + 1}个台阶的费用:"))
# 动态规划数组初始化
dp = [0] * (n + 1)
dp[0] = 0 # 从地面开始,费用为0
dp[1] = cost[0] # 第一个台阶的费用
# 填充dp数组
for i in range(2, n + 1):
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
# 输出达到顶部的最低花费
print(dp[n])
更多推荐
所有评论(0)