509. 斐波那契数
很简单的动规入门题,但简单题使用来掌握方法论的,还是要有动规五部曲来分析。
动态规划五部曲:
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
class Solution:
def fib(self, n: int) -> int:
F=[0,1]
for i in range(2,n+1):
F.append(F[i-1]+F[i-2])
return F[n]
70. 爬楼梯
本题大家先自己想一想, 之后会发现,和 斐波那契数 有点关系。
代码很简单,需要找到递推公式
1. dp数组初始化为[1,2]可通过简单计算得到
2. 到n时,最后一步可以是1或者2,如果最后一步是1的话,那么前面有dp[n-1]种方法,若最后一步是2的话,则前面有dp[n-2]种方法
class Solution:
def climbStairs(self, n: int) -> int:
dp=[1,2]
for i in range(2,n):
dp.append(dp[i-1]+dp[i-2])
return dp[n-1]
746. 使用最小花费爬楼梯
这道题目力扣改了题目描述了,现在的题目描述清晰很多,相当于明确说 第一步是不用花费的。
可顺利推出递归公式,注意点:
1. dp[i]表示的是到达i所需要的最小花销
2. 循环要到n,这样才登顶,若到n-1,则还差最后一步
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
n=len(cost)
dp=[0,0]
for i in range(2,n+1):
min_i=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
dp.append(min_i)
return dp[n]