当前位置: 首页 > news >正文

代码随想录算法训练营第二十八天,动态规划理论基础,509.斐波那契数,70.爬楼梯,746.使用最小花费爬楼梯。

今日内容:动态规划理论基础,509.斐波那契数,70.爬楼梯,746.使用最小花费爬楼梯。

动态规划理论基础

动态规划的解题步骤

  1. 确定dp数组以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

509.斐波那契数

按照解题步骤来:

  1. 确定dp数组以及下标的含义:dp[i]表示第i个斐波那契数。
  2. 确定递推公式:dp[i] = dp[i - 1] + dp[i - 2]
  3. dp数组如何初始化:dp[0] = 0; dp[1] = 1;
  4. 确定遍历顺序:从前向后进行遍历,即从0开始一直到n。
  5. 举例推导dp数组。
int fib(int n) {
    if(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];
}

时间复杂度:O(n);
空间复杂度:O(n)。

优化

只用维护dp[i - 1]和dp[i - 2]。

int fib(int n) {
    if(n <= 1) return n;
    vector<int> dp(2);
    dp[0] = 0;
    dp[1] = 1;
    for(int i = 2; i <= n; i++){
        int sum = dp[i - 1] + dp[i - 2];
        dp[0] = dp[1];
        dp[1] = sum;
    }
    return dp[1];
}

时间复杂度:O(n);
空间复杂度:O(1)。

70.爬楼梯

同样按照解题步骤来:

  1. 确定dp数组以及下标的含义:dp[i]是爬到第i层存在的方法。
  2. 确定递推公式:dp[i] = dp[i - 1] + dp[i - 2]:因为每次可以爬1个或2个台阶,因此是下1个台阶的方法种类再加上下2个台阶的方法种类。
  3. dp数组如何初始化:dp[1] = 1; dp[2] = 2;
  4. 确定遍历顺序:同样是从前向后遍历。
  5. 举例推导dp数组
int climbStairs(int n) {
    if(n <= 1) return 1;
    vector<int>  dp(3);
    dp[1] = 1;
    dp[2] = 2;
    for(int i = 3; i <= n; i++){
        int sum = dp[1] + dp[2];
        dp[1] = dp[2];
        dp[2] = sum;
    }
    return dp[2];
}

时间复杂度:O(n);
空间复杂度:O(1)。

746.使用最小花费爬楼梯

与70相同的做法,还是套模版。

  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数组
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()];
}

时间复杂度:O(n);
空间复杂度:O(n)。

http://www.dtcms.com/a/99073.html

相关文章:

  • OpenAI API - Practice
  • 【全栈开发】—— Paddle OCR 文字识别 + deepseek接入(基于python 最新!!!)
  • 【STL】vector介绍(附部分接口模拟实现)
  • 【C#】`Task.Factory.StartNew` 和 `Task.Run` 区别
  • Ubuntu和Windows实现文件互传
  • HTML基础及进阶
  • 【C++】基础3——正则表达式,静态多态(函数重载和模板),异常处理
  • EverEdit扩展脚本:“AI翻译”插件,让EverEdit自由翻译
  • 排序--归并排序--非递归
  • RAG - 五大文档切分策略深度解析
  • Spring Boot自动配置原理解析
  • Oracle数据库数据编程SQL<3.2 PL/SQL 匿名块中的DML操作、动态SQL、实际应用场景、使用技巧>
  • matplotlib标题比x,y轴字体大,明明标题字体更大?
  • pr--打开视频后没有声音输出
  • VBA第三十三期 如何在VBA中运行Access
  • 大模型评测框架evalscope、openCompass
  • Redis 源码硬核解析系列专题 - 第一篇:Redis源码入门与整体架构
  • 5000元组装一台本地运行中、小模型主机,参考配置 (运行DeepSeek、Qwen)
  • 前缀和c++
  • 2两数相加解题记录
  • Nyquist插件基础:打印格式化字符串(LISP语言)
  • Java虚拟机(JVM)详解
  • 前端 vue 项目上线前操作
  • Spring Cache:简化缓存管理的抽象框架
  • MCP, LangChain、Dify 区别
  • 3.30日 001:中央海岸VS珀斯光荣
  • 操作系统 :进程概念
  • 集多功能为一体的软件,支持批量操作。
  • web权限划分提权和移权
  • 自行车模型与汽车模型的混合策略在自动驾驶中的多维度协同优化