leetCode746 使用最小花費爬樓梯

2021-10-12 12:39:18 字數 1517 閱讀 9949

目錄

一、題目描述

二、解題思路

三、**實現

陣列的每個索引作為乙個階梯,第 i個階梯對應著乙個非負數的體力花費值 cost[i](索引從0開始)。

每當你爬上乙個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬乙個階梯或者爬兩個階梯。

您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初始階梯。

示例 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。

注意:

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 的元素作為初...