Day32 動態規劃Part1

haohaoscnblogs發表於2024-08-17

目錄
  • 任務
    • 509. 斐波那契數
      • 思路
    • 70. 爬樓梯
      • 思路
    • 746. 使用最小花費爬樓梯
      • 思路
  • 心得體會

任務

509. 斐波那契數

斐波那契數 (通常用 F(n) 表示)形成的序列稱為 斐波那契數列 。該數列由 0 和 1 開始,後面的每一項數字都是前面兩項數字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
給定 n ,請計算 F(n) 。

思路

dp[i]表示i這一項的斐波那契值,它為前兩項的和,求F(n)就是求dp(n)的值

class Solution:
    def fib(self, n: int) -> int:
        if n==0: return 0
        dp = [0]* (n+1)
        dp[1] = 1
        for i in range(2,n+1):
            dp[i] = dp[i-1] + dp[i-2]
        return dp[n]

70. 爬樓梯

假設你正在爬樓梯。需要 n 階你才能到達樓頂。

每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?

思路

dp[i]表示爬到第i階有的方法,它等於爬到它上一層的方法和爬到它之前的兩層的方法之和。

class Solution:
    def climbStairs(self, n: int) -> int:
        if n==1: return 1
        dp = [0] * (n+1)
        dp[1] = 1
        dp[2] = 2
        for i in range(3,n+1):
            dp[i] = dp[i-1] + dp[i-2]
        return dp[n]

746. 使用最小花費爬樓梯

給你一個整數陣列 cost ,其中 cost[i] 是從樓梯第 i 個臺階向上爬需要支付的費用。一旦你支付此費用,即可選擇向上爬一個或者兩個臺階。

你可以選擇從下標為 0 或下標為 1 的臺階開始爬樓梯。

請你計算並返回達到樓梯頂部的最低花費。

思路

dp[i]表示爬到當前層需要的最低花費,終止就是求爬到哨兵層的花費(最後一層的後一層)

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        if len(cost) == 1: return cost[0]
        dp = [0] * (len(cost)+1)
        dp[0] = 0
        dp[1] = 0
        for i in range(2,len(cost)+1):
            dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]) # dp[i] 跳到第i個臺階所用的最小花費(前面跳到當前所需要的花費+跳到前面的花費),假設最右邊的len(cost)索引為哨兵
        
        return dp[len(cost)]

心得體會

DP問題的思路:

  1. 思考dp[i]的含義
  2. 思考遞推公式
  3. 確認終止索引及遍歷範圍
  4. 確認初始條件等

相關文章