【LeetCode】746. 使用最小花費爬樓梯

使用最小花費爬樓梯

數組的每一個索引作爲一個階梯,第 i個階梯對應着一個非負數的體力花費值 cost[i](索引從0開始)。java

每當你爬上一個階梯你都要花費對應的體力花費值,而後你能夠選擇繼續爬一個階梯或者爬兩個階梯。數組

您須要找到達到樓層頂部的最低花費。在開始時,你能夠選擇從索引爲 0 或 1 的元素做爲初始階梯。
示例 1:code

輸入: cost = [10, 15, 20]
輸出: 15
解釋: 最低花費是從cost[1]開始,而後走兩步便可到階梯頂,一共花費15。索引

示例 2:leetcode

輸入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
輸出: 6
解釋: 最低花費方式是從cost[0]開始,逐個通過那些1,跳過cost[3],一共花費6。get

注意:博客

1.cost的長度將會在[2,1000]。
2.每個cost[i]將會是一個Integer類型,範圍爲[0,999]。io


動態規劃

這道題算是個人上一篇博客【LeetCode】70. 爬樓梯的升級版了。class

方法一

cost[i]理解爲爬過第i級階梯花費的體力,假設須要5階才能到達樓頂 (注意題目的意思最後一個階梯不是樓頂),dp[5]爲到達樓頂的最低花費。那麼要到達樓頂,只可能有2種狀況:1.前4階的最低花費再加上爬過第4階的花費(這裏爬1個階梯到達樓頂),即dp[4] + cost[4];2.前3階的最低花費再加上爬過第3階的花費(這裏爬2個樓梯到達樓頂),即dp[3] + cost[3];因此狀態轉移方程爲dp[i] = min{dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]}。cli

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        
        int len = cost.length + 1;
        int[] dp = new int[len];
        dp[0] = 0;
        dp[1] = Math.min(0, cost[1]);
        
        for(int i = 2; i < len; i++){
            dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
        }
        
        return dp[len - 1];
    }
}

方法二

cost[i]理解爲從前一種狀態到達第i級階梯花費的體力,其狀態轉移方程爲dp[i] = min{dp[i-1], dp[i-2]} + cost[i]。

相關文章
相關標籤/搜索