746. 使用最小花费爬楼梯(Python)

题目

难度:★★☆☆☆
类型:数组,动态规划

数组的每个索引做为一个阶梯,第 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]

如有疑问或建议,欢迎评论区留言~

你可能感兴趣的:(746. 使用最小花费爬楼梯(Python))