トピック
配列の各インデックスはラダーとして機能し、i番目のラダーは非負の物理的労力コストiに対応します。
はしごを登るたびに、対応する物理的なコスト値を費やす必要があります。その後、1つのはしごを登り続けるか、2つのはしごを登り続けるかを選択できます。
あなたは床の最上部に到達するために最低のコストを見つける必要があります。最初に、インデックス0または1の要素を初期ラダーとして選択できます。
例1:
入力:コスト= [10、15、20]出力:15説明:最小コストはコスト[1]から始まり、2ステップでラダーの一番上まで歩くことができます。合計コストは15です。
例2:
入力:コスト= [1、100、1、1、1、100、1、1、100、1]出力:6説明:
最低コストの方法は、コスト[0]から開始し、1を1つずつ実行することです。 、スキップコスト[3]、合計6のコスト。注意:
cost 的长度将会在 [2, 1000]。 每一个 cost[i] 将会是一个Integer类型,范围为 [0, 999]。
問題解決のアイデア
動的計画法
質問を通して、各ステップが前のステップに関連していることがわかります。そのため、動的計画法が自然に思い浮かびます。
動的計画法の使用法を知っていると、状態定義と状態遷移方程式も決定する必要があります。
状態の定義:
dp [i]は、i番目のステップに到達するための最小コストを表します。
状態遷移方程式:
i番目のステップにはi-1番目のステップまたはi-2番目のステップを含めることができます。最小のコストを確保するために、このステップに到達するために2つと物理的なコストの最小値のみを取ることができます。つまり、dp[i]=min(dp[i-1],dp[i-2])+cost[i]
最後に、ユースケースを通じて、建物の最上部に到達することは、建物の最上部への最後のステップ、または最後から2番目のステップであり、最後に2つのステップを最上部にステップすることができることがわかります。建物の最上部に到達するのに肉体的な努力は必要ないと考えることができます。
コード
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
dp = [cost[0],cost[1]]+[0]*(len(cost)-2)
for i in range(2,len(cost)):
dp[i] = min(dp[i-1],dp[i-2])+cost[i]
return min(dp[-1],dp[-2])