目錄
一、題目描述
二、解題思路
三、**實現
陣列的每個索引作為乙個階梯,第 i個階梯對應著乙個非負數的體力花費值 cost[i](索引從0開始)。
每當你爬上乙個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬乙個階梯或者爬兩個階梯。
您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初始階梯。
示例 1:
輸入: cost = [10, 15, 20]示例 2:輸出: 15
解釋: 最低花費是從cost[1]開始,然後走兩步即可到階梯頂,一共花費15。
輸入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]注意:輸出: 6
解釋: 最低花費方式是從cost[0]開始,逐個經過那些1,跳過cost[3],一共花費6。
cost 的長度將會在 [2, 1000]。
每乙個 cost[i] 將會是乙個integer型別,範圍為 [0, 999]。
這是一道簡單動態規劃題,記錄的原因在於是我第一次做的從後往前遞推的動態規劃題。這道題當然也可以從前往後遞推,但是從前往後遞推容易陷入一些思維陷阱。
比如假設dp[i]為到達下標i的台階的花費,當i=0是,我想當然的認為dp[0] = cost[0],這顯然不對,因為0和1是可以直接作為初始階梯的,這就意味著到達階梯0或者1不需要消耗體力值,花費為0。然後對於 2 >= i <=n -1的台階,dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]。
那隨之而來的另乙個問題是這樣做只到達n -1級台階啊,並沒有到頂。
解決方案是dp陣列要加乙個元素,用來表示頂部,最後返回dp[n]即可。
說說從後往前推的方式:
dp[i]表示的是從台階i到達樓梯頂需要的最小花費,那麼我們要求的就是min(dp[0], dp[1]);
顯示dp[n - 1] = cost[ n - 1],dp[n - 2] = cost[n - 2]。
dp[i] = min(dp[i + 1], dp[i + 2]) + cost[i]。
動態規劃題的起點是你的dp陣列的含義,所以如何設計乙個方便解題dp陣列是一門技術活!
#include using namespace std;
int mincostclimbingstairs(vector& cost)
return min(dp[0], dp[1]);}
int main() ;
cout << mincostclimbingstairs(cost);
return 0;
}
LeetCode 746 使用最小花費爬樓梯
陣列的每個索引做為乙個階梯,第i個階梯對應著乙個非負數的體力花費值cost i 索引從0開始 每當你爬上乙個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬乙個階梯或者爬兩個階梯。您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初始階梯。示例 1 輸入 co...
LeetCode746 使用最小花費爬樓梯
陣列的每個索引做為乙個階梯,第i個階梯對應著乙個非負數的體力花費值cost i 索引從0開始 每當你爬上乙個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬乙個階梯或者爬兩個階梯。您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初始階梯。示例 1 輸入 co...
LeetCode 746 使用最小花費爬樓梯
陣列的每個索引做為乙個階梯,第i個階梯對應著乙個非負數的體力花費值cost i 索引從0開始 每當你爬上乙個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬乙個階梯或者爬兩個階梯。您需要找到達到樓層頂部 不是只到最後乙個階梯就行 的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初...