目錄
- 任務
- 509. 斐波那契數
- 思路
- 70. 爬樓梯
- 思路
- 746. 使用最小花費爬樓梯
- 思路
- 509. 斐波那契數
- 心得體會
任務
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問題的思路:
- 思考dp[i]的含義
- 思考遞推公式
- 確認終止索引及遍歷範圍
- 確認初始條件等