文章目录
- [LeetCode:509. 斐波那契数](#LeetCode:509. 斐波那契数)
- [LeetCode:70. 爬楼梯](#LeetCode:70. 爬楼梯)
- [LeetCode:746. 使用最小花费爬楼梯](#LeetCode:746. 使用最小花费爬楼梯)
LeetCode:509. 斐波那契数
https://leetcode.cn/problems/fibonacci-number/
思路
状态转移方程 dp[i] = dp[i - 1] + dp[i - 2] .
解答
python
class Solution:
def fib(self, n: int) -> int:
if n == 0:
return 0
elif n == 1:
return 1
dp0 = 0
dp1 = 1
for i in range(2, n + 1):
temp_sum = dp0 + dp1
dp0 = dp1
dp1 = temp_sum
return dp1
LeetCode:70. 爬楼梯
https://leetcode.cn/problems/climbing-stairs/
思路
爬 n 级楼梯的爬法,可以从 n -1 级跨 1 个台阶,也可以从 n - 2 级跨 2 个台阶。即 dp[i] = dp[i - 1] + dp[i - 2] 。
解答
python
class Solution:
def climbStairs(self, n: int) -> int:
if n == 1:
return 1
if n == 2:
return 2
dp1 = 1
dp2 = 2
for i in range(3, n + 1):
temp_sum = dp1 + dp2
dp1 = dp2
dp2 = temp_sum
return dp2
LeetCode:746. 使用最小花费爬楼梯
https://leetcode.cn/problems/min-cost-climbing-stairs/description/
思路
用 dp 数组记录到每个下标的最小耗费,要登顶则 i == n,刚好越界。则状态转移方程为:dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]) ,即要到 i 处考虑从 i - 1 处消耗 cost[i-1] 跳 1 级,或从 i - 2 处消耗 cost[i-2] 跳 2 级。
解答
python
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
n = len(cost)
dp = [None] * (n + 1) # 记录到每个下标的最小耗费,要登顶则 i == n,刚好越界
dp[0] = 0 # 直接从 cost[0] 或 cost[1] 出发,不消耗
dp[1] = 0
for i in range(2, n + 1):
dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])
return dp[n]