509. 斐波那契数
class Solution:
def fib(self, n: int) -> int:
if n == 0: #还是要写的,加强健壮性
return 0
dp = [0] * (n + 1)
dp[0] = 0
dp[1] = 1
for i in range(2, n + 1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
【思考】注意这两个n+1
70. 爬楼梯
class Solution:
def climbStairs(self, n: int) -> int:
if n <= 1:
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]
【思考】爬第i层楼梯,其实就是前两层爬楼的方式总和相加。因为:爬到第i-1层,再爬一层就行;爬到第i-2层,再爬两层就行。
746. 使用最小花费爬楼梯
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
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])
return dp[len(cost)]
【思考】 爬第i层的最少花费就是 min(爬到i-1层的花费+从i-1层爬到i层的花费,爬到i-2层的花费+从i-2层爬到i层的花费)
动规题代码易错:
1. dp = [0] * (n + 1) 及for循环是到n还是n+1,return dp[n] 还是[n+1]
可以想一想如列表长度n=3,则需要到第4个数(dp=[0]*(3+1)),但其下标为3(for i in range(##, 3+1)),最后返回dp[3] 。 第n+1个数的下标为n
2. dp = [0] * (n + 1) not dp = dp[0] * (n + 1) !!!!!