Bootstrap

力扣整理版十:动态规划(待更新)

动态规划:每一个状态由上一个状态推导出来。

---------------------------

(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 0
        if n==1:return 1
        pre2=0
        pre1=1
        res=0
        for _ in range(n-1):
            res=pre2+pre1
            pre2,pre1=pre1,res
        return res

2、70 爬楼梯 

70. 爬楼梯 - 力扣(LeetCode)

题目描述:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

------------  python  -----------

class Solution:
    def climbStairs(self, n: int) -> int:
        if n==1:return 1
        pre2=1
        pre1=1
        for i in range(n-1):
            sum=pre1+pre2
            pre2=pre1
            pre1=sum
        return 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为前一步的值,即上一次循环中的dp1
            dp1 = dpi  # 更新dp1为当前步的最小花费
        
        return dp1  # 返回到达楼顶的最小花费

4、不同路径 

二、背包问题-背包

三、背包问题-完全背包

四、背包问题-多重背包

五、打家劫舍

六、股票问题

七、子序列-不连续

八、子序列-连续

九、子序列-编辑距离

十、子序列-回文

;