使用最小花费爬楼梯

题目描述:

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

  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])  

更多推荐