动态规划的核心和存在重复子问题。
再需要注意的一点就是什么时候结束,爬楼梯是数组长度需要等于len(cost) + 1。
509. 斐波那契数
class Solution:
def fib(self, n: int) -> int:
# 递归
if n == 0:
return 0
if n == 1:
return 1
# return self.fib(n-1) + self.fib(n-2)
# dp
dp = [0] * (n+1)
dp[1] = 1
for i in range(2,n+1):
dp[i] = dp[i-1] + dp[i-2]
return dp[-1]
70. 爬楼梯
可以优化的点,不需要把所有的状态存下来。
class Solution:
def climbStairs(self, n: int) -> int:
# F(n) = F(n-1) + F(n-2)
dp = [1] * (n+1)
for i in range(2,n+1):
dp[i] = dp[i-1] + dp[i-2]
return dp[-1]
746. 使用最小花费爬楼梯
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
# dp[i] 表示到达[i]花的钱 dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])
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]