程式碼隨想錄演算法訓練營第35天 | 動態規劃1:509.斐波那契數、70.爬樓梯、746.使用最小花費爬樓梯

哆啦**發表於2024-07-21

程式碼隨想錄演算法訓練營第35天 |

動態規劃理論基礎
https://programmercarl.com/動態規劃理論基礎.html#演算法公開課
509.斐波那契數
https://leetcode.cn/problems/fibonacci-number/submissions/548309803/
程式碼隨想錄
https://programmercarl.com/0509.斐波那契數.html#演算法公開課
70.爬樓梯
https://leetcode.cn/problems/climbing-stairs/description/
程式碼隨想錄
https://programmercarl.com/0070.爬樓梯.html#其他語言版本
746.使用最小花費爬樓梯
https://leetcode.cn/problems/min-cost-climbing-stairs/description/
程式碼隨想錄
https://programmercarl.com/動態規劃理論基礎.html#演算法公開課

理論基礎

常見題目

  1. 動規基礎
  2. 揹包問題
  3. 打家劫舍
  4. 股票問題
  5. 子序列問題

思考路線

  1. dp陣列含義、下標含義;
  2. 遞推公式;
  3. dp陣列如何初始化;
  4. 遍歷順序;
  5. 列印dp陣列Debug;

509. 斐波那契數

題解思路

  • dp演算法的意義和初始化在題目裡已經定義好了

題解程式碼

class Solution:
    def fib(self, n: int) -> int:
        if n<2:
            return n
        ##考慮特殊情況

        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.爬樓梯

題解思路

  • dp含義:第i個數字代表第i節樓梯有dp[i]中方法到達樓頂
  • 遞推公式:每次可以爬1-2級臺階 即dp[i] = dp[i-1]+dp[i-2]
  • 正常遍歷
  • 只需要兩個儲存空間 dp[0] dp[1] 按位迴圈即可

題解程式碼

class Solution:
    def climbStairs(self, n: int) -> int:
        if n<3:
            return n
        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]
class Solution:
    def climbStairs(self, n: int) -> int:
        if n<3:
            return n
        dp = [0]*2
        dp[0] = 1
        dp[1] = 2

        for i in range(2,n):
            data = dp[0]+dp[1]
            dp[0] = dp[1]
            dp[1] = data
        return dp[1]

746. 使用最小花費爬樓梯

題解思路:

  • dp含義:dp[i]為第i個臺階前的花銷;所以最後的結果為len(cost)+1 最後一個值;
  • 遞推公式:dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
  • 可以壓縮dp的空間

題解程式碼

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        dp = [0]*(len(cost)+1) ##到該節臺階需要的花費

        for i in range(2,len(cost)+1):
            dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])

        return dp[-1]
class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        dp = [0]*2 ##到該節臺階需要的花費
        for i in range(2,len(cost)+1):
            data = min(dp[1]+cost[i-1],dp[0]+cost[i-2])
            dp[0] = dp[1]
            dp[1] = data
        return dp[-1]

相關文章