509. 斐波那契数
动态规划五部曲:
- 确定一个dp[i]的含义:第i个fib数
- 确定递推公式:dp[i]=dp[i-1]+dp[i-2]
- 确定dp数组如何初始化:dp[0]=1,dp[i]=1
- 确定遍历顺序:dp[i]是从i-1和i-2得到,即从前往后遍历
- 打印dp数组,是用来debug的方式
solution(递归写法)
class Solution:
def fib(self, n: int) -> int:
if n==0:return 0
if n==1:return 1
res=self.fib(n-1)+self.fib(n-2)
return res
70. 爬楼梯
题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
递推公式
为什么递推公式是:dp[i]=dp[i-1]+dp[i-2]:
- 要达到第i个台阶时,有dp[i-1]种方法到i-1台阶,剩余1格台阶直接一步走到。
- 要达到第i个台阶时,有dp[i-2]种方法到i-2台阶,剩余2格台阶,不可以用两个1步的方法,因为如果这样的话,第一次的一步就走到了i-1,这样就会跟前面1中的某种方法重合。所以倒退到i-2只能用一次性爬两步到i
solution
class Solution:
def climbStairs(self, n: int) -> int:
if n==1:return 1 # there is only 1 way to climb upstair
if n==2:return 2
# 用递归超时了
ways=[0]*(n+1)
ways[0]=0
ways[1]=1
ways[2]=2
for i in range(3,n+1):
ways[i]=ways[i-1]+ways[i-2]
return ways[n]
746. 使用最小花费爬楼梯
题目
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
思路记录
- 题意理解:如果cost=[10,15,20],则楼顶是指到达index为3的位置,即dp的长度比cost长1
- dp[i]的含义:表示到达i所用的最少花费
- 递推公式确定:
可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]。
dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。
dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。
那么究竟是选从dp[i - 1]跳还是从dp[i - 2]跳呢?
一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]); - 初始化:因为可以选择从0和1开始爬楼梯,所以dp[0]和dp[1]都为0,表示不需要花费就到达了这里。
先确定递推公式,再进行初始化,因为递推公式决定怎么初始化 - 目标是得到dp的最后一个值
solution
自己做的!!!!!小狗鼓掌
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
targetstair=len(cost)
dp=[0]*(len(cost)+1)
dp[0]=0
dp[1]=0
for i in range(2,len(dp)):
dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
return dp[-1]