程式碼隨想錄演算法訓練營第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#演算法公開課
理論基礎
常見題目
- 動規基礎
- 揹包問題
- 打家劫舍
- 股票問題
- 子序列問題
思考路線
- dp陣列含義、下標含義;
- 遞推公式;
- dp陣列如何初始化;
- 遍歷順序;
- 列印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]