746.使用最低花费爬楼梯

动态规划是一大领域,复杂切困难但是我们接触的大都是基本的定义,但是我们应该有应有的理论基础,动态规划有一定的规划步骤,在代码随想录里有相应步骤,想了解者自行查询。对于力扣动态规划746题,我们应用的基本思想就是通过“局部最小,得到全局最小”,在通过dp数组得到最终的结果。

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

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

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

 

示例 1:

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。

示例 2:

输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。

 

提示:

  • 2 <= cost.length <= 1000
  • 0 <= cost[i] <= 999

class Solution {

    public int minCostClimbingStairs(int[] cost) {

        //不可使用贪心

        //动态规划

        //dp[i] - 爬到索引i处台阶所花费的最小费用 - 以及要从这里开始上爬的花费

        //dp[0] - cost[0]

        //dp[1] - cost[1] (直接从第二台阶开始跳)

        //dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]

        //ans = min(dp[cost.length - 1], dp[cost.length - 2]) (最后跳到倒数第二阶再跳两步,或者跳到最后一阶再跳一步)

        if (cost.length == 0) {

            return 0;

        }

        if (cost.length == 1) {

            return cost[0];

        }

        if (cost.length == 2) {

            return Math.min(cost[0], cost[1]);

        }

        int[] dp = new int[cost.length];

        dp[0] = cost[0];

        dp[1] = cost[1];

        for (int i = 2; i < cost.length; i++) {

            dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];

        }

        return Math.min(dp[cost.length - 1], dp[cost.length - 2]);

    }

}

你可能感兴趣的:(python,算法,数据结构,动态规划)