动规五部曲:
- 确定dp数组以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
LC509. 斐波那契数
class Solution:
def fib(self, n: int) -> int:
if n < 2:
return n
dp = [0] * (n+1) #dp[i]表示第i个数的斐波那契数为dp[i]
dp[0] = 0
dp[1] = 1 #dp数组初始化
for i in range(2, n+1): #遍历顺序从前向后
dp[i] = dp[i-1] + dp[i-2] #递推公式
return dp[-1]
LC70. 爬楼梯:
class Solution:
def climbStairs(self, n: int) -> int:
if n < 3:
return n
dp = [0] * (n+1) # dp[i]表示在i层有dp[i]种方法,n+1表示从index为0的地方开始算起
dp[1] = 1
dp[2] = 2 #初始化dp数组
for i in range(3,n+1): #从前向后遍历 ,range起点为3表示数组从index为0开始
dp[i] = dp[i-1] + dp[i-2] #递推公式
return dp[-1]
LC746. 使用最小花费爬楼梯
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
dp = [0] * (len(cost)+1) #dp[i]表示到达第i层需要花费dp[i]的费用
dp[0] = 0
dp[1] = 0 #初始化dp数组,题目描述可以从第0层或第1层开始,所以第0层和第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-1]和dp[i-2]都可以到达dp[i],那么需要找到最小的即可
return dp[len(cost)]