动态规划:每一个状态由上一个状态推导出来。
---------------------------
(1) 509 斐波那契数
(2) 70 爬楼梯
(3) 746 使用最小花费爬楼梯
---------------------------
一、基础题目
1、509 斐波那契数
509. 斐波那契数 - 力扣(LeetCode)
题目描述:斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给你n ,请计算 F(n) 。
Tips:我感觉和前面70爬楼梯的思想差不多。
------------ python -----------
class Solution:def fib(self, n: int) -> int:if n==0:return 0if n==1:return 1pre2=0pre1=1res=0for _ in range(n-1):res=pre2+pre1pre2,pre1=pre1,resreturn res
2、70 爬楼梯
70. 爬楼梯 - 力扣(LeetCode)
题目描述:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
------------ python -----------
class Solution:def climbStairs(self, n: int) -> int:if n==1:return 1pre2=1pre1=1for i in range(n-1):sum=pre1+pre2pre2=pre1pre1=sumreturn sum
3、746 使用最小花费爬楼梯
746. 使用最小花费爬楼梯 - 力扣(LeetCode)
题目描述:数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。
------------ python -----------
class Solution:def minCostClimbingStairs(self, cost: List[int]) -> int:dp0 = 0 # 初始值,表示从起点开始不需要花费体力dp1 = 0 # 初始值,表示经过第一步不需要花费体力for i in range(2, len(cost) + 1):# 在第i步,可以选择从前一步(i-1)花费体力到达当前步,或者从前两步(i-2)花费体力到达当前步# 选择其中花费体力较小的路径,加上当前步的花费,得到当前步的最小花费dpi = min(dp1 + cost[i - 1], dp0 + cost[i - 2])dp0 = dp1 # 更新dp0为前一步的值,即上一次循环中的dp1dp1 = dpi # 更新dp1为当前步的最小花费return dp1 # 返回到达楼顶的最小花费
4、62 不同路径
题目描述:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?
------------ python -----------