代码随想录算法训练营day32 | 509. 斐波那契数 、70. 爬楼梯 、746. 使用最小花费爬楼梯

碎碎念:开始动态规划了!加油!

参考:代码随想录

动态规划理论基础

动态规划常见类型:

  1. 动规基础类题目
  2. 背包问题
  3. 打家劫舍
  4. 股票问题
  5. 子序列问题

解决动态规划问题应该要思考清楚的:
动态规划五部曲:

  1. dp数组以及它下标的含义
  2. 递推公式
  3. dp数组如何初始化
  4. 遍历顺序
  5. 打印dp数组

509. 斐波那契数

题目链接

509. 斐波那契数

思想

动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[i] 第i个斐波那契数
  2. 确定递推公式:dp[i] = dp[i-1]+dp[i-2]
  3. dp数组的初始化:dp[0]=1 dp[1]=1
  4. 确定遍历顺序:从前向后遍历
  5. 打印dp数组:主要用来debug

由于求一个值只依赖前两个值,所以我们没必要维护一个数组,可以维护三个变量来完成状态转移。见python代码。

题解

cpp 复制代码
// cpp
class Solution {
public:
    int fib(int n) {
        if (n == 0 || n == 1) return n;
        vector<int> dp(n+1);
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }
};
python 复制代码
# python
class Solution:
    def fib(self, n: int) -> int:
        if n <= 1:
            return n
        
        prev1, prev2 = 0, 1

        for _ in range(2, n+1):
            cur = prev1 + prev2
            prev1, prev2 = prev2, cur
        
        return prev2

反思

本题简单,是因为题中已经给出了递推公式和初始值。

70. 爬楼梯

题目链接

70. 爬楼梯

思想

动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[i] 表示达到i阶梯有dp[i]种方法
  2. 确定递推公式:dp[i] = dp[i-1]+dp[i-2] 爬到第i阶时,要么是从i-1一步过来的,要么从i-2一步迈两阶过来的
  3. dp数组的初始化:dp[0]=0 dp[1]=1(dp[0]的取法主要是为了使得dp[2]为2,从含义上来说,到达0阶应该0种方法)也可以初始化dp[1]=1,dp[2]=2,不初始化dp[0]
  4. 确定遍历顺序:从前向后遍历
  5. 打印dp数组:主要用来debug

和上一题同理,也可以优化掉dp数组。

题解

cpp 复制代码
// cpp
class Solution {
public:
    int climbStairs(int n) {
        if (n <= 1) return n;
        vector<int> dp(n+1);
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }

        return dp[n];
    }
};
python 复制代码
# python
class Solution:
    def climbStairs(self, n: int) -> int:
        if n <= 1:
            return n
        
        prev1 = 1
        prev2 = 2
        for _ in range(3, n + 1):
            cur = prev1 + prev2
            prev1, prev2 = prev2, cur
        
        return prev2

反思

注意初始化那部分。

746. 使用最小花费爬楼梯

题目链接

746. 使用最小花费爬楼梯

思想

注意站在某个位置不花费cost,要爬上台阶的时候才会花费cost。

如图所示,顶楼应该在3的位置。

动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[i] 表示达到下标i的位置所需要的最小花费
  2. 确定递推公式:dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])
  3. dp数组的初始化:dp[0]=0 dp[1]=0
  4. 确定遍历顺序:从前向后遍历
  5. 打印dp数组:主要用来debug

和上一题同理,也可以优化掉dp数组。

题解

cpp 复制代码
// cpp
class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        vector<int> dp(cost.size() + 1);
        dp[0] = 0;
        dp[1] = 0;
        for (int i = 2; i <= cost.size(); i++) {
            dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
        }
        return dp[cost.size()];
    }
};
python 复制代码
# python
class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        prev1 = 0
        prev2 = 0
        for i in range(2, len(cost) + 1):
            cur = min(prev1 + cost[i - 2], prev2 + cost[i - 1])
            prev1, prev2 = prev2, cur
        
        return prev2
        

反思

相关推荐
林开落L2 分钟前
前缀和算法习题篇(上)
c++·算法·leetcode
远望清一色3 分钟前
基于MATLAB边缘检测博文
开发语言·算法·matlab
tyler_download5 分钟前
手撸 chatgpt 大模型:简述 LLM 的架构,算法和训练流程
算法·chatgpt
SoraLuna25 分钟前
「Mac玩转仓颉内测版7」入门篇7 - Cangjie控制结构(下)
算法·macos·动态规划·cangjie
我狠狠地刷刷刷刷刷28 分钟前
中文分词模拟器
开发语言·python·算法
鸽鸽程序猿28 分钟前
【算法】【优选算法】前缀和(上)
java·算法·前缀和
九圣残炎34 分钟前
【从零开始的LeetCode-算法】2559. 统计范围内的元音字符串数
java·算法·leetcode
YSRM1 小时前
Experimental Analysis of Dedicated GPU in Virtual Framework using vGPU 论文分析
算法·gpu算力·vgpu·pci直通
韭菜盖饭1 小时前
LeetCode每日一题3261---统计满足 K 约束的子字符串数量 II
数据结构·算法·leetcode
geng小球1 小时前
LeetCode 78-子集Ⅱ
java·算法·leetcode