题目
难度:★★☆☆☆
类型:数组,动态规划
数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi。
每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。
您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。
注意
cost 的长度将会在 [2, 1000]。
每一个 cost[i] 将会是一个Integer类型,范围为 [0, 999]。
示例 1
输入: cost = [10, 15, 20]
输出: 15
解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。
示例 2
输入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
输出: 6
解释: 最低花费方式是从cost[0]开始,逐个经过那些1,跳过cost[3],一共花费6。
解答
我们用动态规划解决这个问题。
首先考虑特殊情况,当输入阶梯数组为空时,返回零,当输入结题数组不超过2个元素时,返回其中的最小值;
我们定义数组dp,dp[i]表示到达下标为i的阶梯需要消耗的最小能量。这里需要注意,顶部阶梯实际上是被题目缺省掉的,即到达顶部阶梯所需要消耗的能量为零,我们需要补回来。
条件
一次可以迈一步或者两步。
初始化
i=0时,只有一个阶梯,因此到达该阶梯顶部需要的能量即为到达该阶梯所需能量,为cost[0];
i=1时,有两个阶梯,我们可以迈两步,跳过第一级台阶,到达该阶梯所需要的能量为到达第二级台阶所需能量,为cost[1];
状态转移方程
i>1时,到达第i级台阶只有两种选择,一种是从第i-1级台阶迈一步,另一种是从i-2级台阶迈两步,这两种选择消耗的最少能量分别是dp[i-1]+cost[i]和dp[i-2]+cost[i],我们取两者的最小值,即为到达下标为i的台阶所需的最少能量:
dp[i] = min(dp[i-1], dp[i-2]) + cost[i]
编码实现:
class Solution:
def minCostClimbingStairs(self, cost):
if not cost:
return 0
if len(cost) <= 2:
return min(cost)
cost.append(0)
dp = [None for _ in range(len(cost))]
dp[0], dp[1] = cost[0], cost[1]
for i in range(2, len(cost)):
dp[i] = min(dp[i-2], dp[i-1]) + cost[i]
print(dp)
return dp[-1]
如有疑问或建议,欢迎评论区留言~