509. Fibonacci Number
DP
class Solution:
def fib(self, n: int) -> int:
if n <= 1: return n
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]
递归
class Solution:
def fib(self, n: int) -> int:
if n <= 1: return n
return self.fib(n - 1) + self.fib(n - 2)
70. Climbing Stairs
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]
优化空间
class Solution:
def climbStairs(self, n: int) -> int:
if n <= 1: return n
dp = [0] * 3
dp[1] = 1 # 爬到第一层有一种爬法
dp[2] = 2 # 爬到第二层有两种爬法
for i in range(3, n + 1):
tmp = dp[1] + dp[2]
dp[1] = dp[2]
dp[2] = tmp
return dp[2]
746. Min Cost Climbing Stairs
dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]
dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]
dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
dp = [0] * (len(cost) + 1)
# 可以从第0层或第1层开始,不消耗
dp[0], dp[1] = 0, 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[-1]