力扣 動態規劃 使用最小花費爬樓梯

2021-09-12 08:02:27 字數 2221 閱讀 9271

說明

陣列的每個索引做為乙個階梯,第 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方程:

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

意思是 當前階最小值是處於上一階時邁兩階(不經過當前這一階)與前一階加上這一階和 這兩者的最小值為到當前階耗費的最小體力。

這種想法真的看著非常合理,如果處於上一階那肯定不經過此階最小,如果處於前一階想到此階肯定只能邁兩階到當前階最小,然後兩者比較一下取最小值。

但是這是錯誤的,原因有兩點:

1. 如果此階台階不是最後一階且最小值恰好取上一階的情況,就造成了在此階台階的最小值不會加上此階的體力。如果緊接著在下一階上樓時用到了這一階的最小值(把這一階台階命名為a 方便敘述),就會出現乙個荒謬的錯誤點—從a台階上樓但不經過a台階再跨越一階台階,相當於飛了兩階台階上去,這裡解釋的可能有些抽象,下面舉個例子

假如體力是0 0 1 1

四階台階命名為a b c d

如果要求d台階的最小體力值,那麼根據方程就知道是c台階的值與b台階的值加上d台階的值兩者取最小

按照這種方程思想,到達c台階的最小體力值是0,然後看d台階,最小體力值此時肯定是從c上來的,也就是0.

但是再看看體力值,無論怎麼上台階都不可能體力是0,最小值明顯是1,所以說,就像飛了過去一樣。

2. 大家仔細觀察這個方程可以發現,這個方程根本沒有只上1階台階的情況,所以肯定是錯誤的。

正確思想

什麼是演算法?演算法是為了能讓人更好、更快的解決生活中遇到的各類問題的一種運算。而我們不應該為了套用某種演算法而故意向某類演算法貼合。我們學演算法只能去學一種演算法思想,而真正的內容只能靠我們去填,填的不是模板 而是數學。

說多了點,其實這道題根本沒那麼複雜,做法就是 算出經過每一階台階的最小值,然後返回最後兩階台階中更小的那個就行了。

怎麼算經過每一階的最小值呢?題目說了,只能邁一階或者兩階,那麼dp方程就是:dp[i] = min(dp[i - 2], dp[i - 1]) + cost[i]。

注意,我們算出的是經過了每一階台階的最小值,並非上到此階台階時所消耗的最小體力值。

下面貼**:

python code

class

solution

:def

mincostclimbingstairs

(self, cost: list[

int])-

>

int:

f1, f2 = cost[0]

, cost[1]

for i in

range(2

,len

(cost)):

f1, f2 = f2,

min(f1, f2)

+ cost[i]

return

min(f1, f2)

c++ code
class solution 

return

min(res1, res2);}

};

使用最小花費爬樓梯(動態規劃 LeetCode)

題目鏈結 陣列的每個索引作為乙個階梯,第 i個階梯對應著乙個非負數的體力花費值 costi。每當你爬上乙個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬乙個階梯或者爬兩個階梯。您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初始階梯。示例 1 輸入 cos...

力扣 動態規劃 爬樓梯

說明 假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 2 階示例 2 輸入 3 輸出 3 解釋 有三種方法可以爬到樓頂。1 階...

使用最小花費爬樓梯

陣列的每個索引做為乙個階梯,第 i個階梯對應著乙個非負數的體力花費值 cost i 索引從0開始 每當你爬上乙個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬乙個階梯或者爬兩個階梯。您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初始階梯。示例 1 輸入 ...