动态规划五步曲:
1. 确定dp数组的定义,以及下标的含义
2. 确定递推公式
3. dp数组如何初始化
4. 遍历顺序
5. 打印dp数组
class Solution:
def fib(self, n: int) -> int:
#corner case
if n == 0:
return 0
#dp数组定义和下标
dp = [0] * (n+1)
#递推公式(已给)
#初始化dp
dp[0], dp[1] = 0, 1,
#遍历顺序
for i in range(2, n+1):
dp[i] = dp[i-2] + dp[i-1]
return dp[n]
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]
dp[i]:到达i的位置所需要的最小花费
递推公式:dp[i] = min((dp[i-1] + cost[i-1]) , (dp[i-2] + cost[i-2]))
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
dp = [0] * (len(cost)+1)
#可以选择从下标为 0 或下标为 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])
return dp[len(cost)]