【动态规划】【斐波那契数列模型】三步问题、第N个泰波那契数、使用最小花费爬楼梯

模板

算法原理

  • 做动态规划的题目,一般会先创建一个一维数组 dp,称之为 dp表
  • 我们想办法填满这个 dp表,里面的某个值就是最终结果

采用动态规划,一般分五步

  1. 状态表示

    1. 是什么?
      • dp 表中每一个值所表示的含义就是状态表示(通俗解释)
    2. 怎么来?非常重要
      • 题目要求
      • 经验+题目要求(多做题)
      • 分析问题的过程中,发现重复子问题
  2. 推导状态转移方程

    • dp[i]等于什么,方程就是什么
  3. 初始化

    • 保证填表的时候不越界
    • 根据状态转移方程进行填表
  4. 填表顺序

    • 为了填写当前状态的时候,所需要的状态已经计算过了
  5. 返回值

    • 题目要求+状态表示

代码编写

  1. 创建 dp 表
  2. 初始化
  3. 填表
  4. 返回值

1. 第 N 个泰波那契数

1137. 第 N 个泰波那契数 - 力扣(LeetCode)
image.png|550

题目解析

Tn 等于前三项之和
image.png|473

算法思路

  1. 状态表示:

    • 本题直接通过题目要求可知——>dp[i]表示第 i 个泰波那契数的值
  2. 根据状态表示推导状态转移方程:dp[i] = dp[i-1]+dp[i-2]+dp[i-3]

    • 依赖对象: dp[i] 依赖的是前三个状态
    • 如何依赖:前三个状态之和
  3. 初始化:dp[0]=0 dp[1]=dp[2]=1

  4. 填表顺序:从左向右

  5. 返回值:dp[n]

代码编写

/**  
 * 2024-8-3 * 1. 求第 N 个泰波那契数  
 * @param n  
 * @return  
 */  
public int tribonacci(int n) {  
    //1. 创建 dp表  
    int[] dp = new int[n + 1];  
  
    //处理一下边界情况  
    if (n == 0) return 0;  
    if (n == 1 || n == 2) return 1;  
  
    //2. 初始化  
    dp[0] = 0;  
    dp[1] = dp[2] = 1;  
  
    //3. 填表  
    for (int i = 3; i <= n; i++) {  
        dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];  
    }  
    //4. 返回值  
    return dp[n];  
}

注意:

  • for 循环的起点是 i == 3
  • 终点是 i = n

空间优化

滚动数组
当在填 dp 表的时候,每次计算只需要前三个值,再前面的值都没用,所占的空间也就浪费了,这时候就可以用滚动数组
image.png|626

/**  
 * 利用滚动数组  
 * 进行空间优化  
 *  
 * @param n  
 * @return  
 */  
public int tribonacci2(int n) {  
  
    //处理一下边界情况  
    if (n == 0) return 0;  
    if (n == 1 || n == 2) return 1;  
  
    int a = 0, b = 1, c = 1, d = 0;  
  
    for (int i = 3; i <= n; i++) {  
        d = a + b + c;  
        //滚动操作  
        a = b;  
        b = c;  
        c = d;  
    }  
    return d;  
}

除了上面的两个点之外,注意:

  • d 必须是在 for 循环之外定义,不能在循环里面,要不然是一个局部变量,最后无法接收返回值
  • 返回值是 d,不是 n

2. 三步问题

面试题 08.01. 三步问题 - 力扣(LeetCode)
image.png

题目解析

image.png

算法原理

  1. 状态表示:dp[i] 代表上到第 i 阶共有多少种方法

    • 经验:以某个位置为起点或结尾…
    • 题目要求:…
    • 本题是以 i 位置为结尾
  2. 状态转移方差:dp[i] = dp[i-1]] + dp[i-2] +dp[i-3]

    • i 位置状态,最近的一步,来划分问题
    • dp[i]
      1. 从(i - 1)—>i == dp[i-1]
      2. 从(i - 2)—>i == dp[i-2]
      3. 从(i - 3)—>i == dp[i-3]
  3. 初始化:dp[1] = 1; dp[2] = 2; dp[3] = 4;

  4. 填表顺序:从左往右

  5. 返回值:dp[n]

代码编写

public int waysToStep(int n) {  
    int MOD = (int)1e9 + 7;  
  
    //处理边界情况  
    if(n == 1 || n == 2) return n;  
    if(n == 3) return 4;  
  
    int[] dp = new int[n+1];  
    dp[1] = 1; dp[2] = 2; dp[3] = 4;  
    for (int i = 4; i <= n; i++) {  
        dp[i] = ((dp[i-1] + dp[i-2]) % MOD + dp[i-3]) % MOD;  
    }    
    return dp[n];  
}

注意:

  • 取模的写法
  • 结果是在每次进行了加法运算之后就要进行取模(所以这里需要取两次模)
    • 因为每次进行运算都有可能会溢出

3 . 使用最小花费爬楼梯

746. 使用最小花费爬楼梯
image.png

题目解析

首先需要找到楼顶在哪,在数组最后一个元素的下一位

  • 我们看示例 1,如果楼顶是数组最后一个元素,那最小花费应该是从 10 直接到 20,一共 10 元

当走到最后一个元素的下一位才算走到终点,走到最后一个元素不算

算法原理

解法一

  1. 确定状态表示

    • 经验:以 i 位置为结尾
    • 题目要求
    • dp[i] 表示到达 i 位置时的最小花费
  2. 状态转移方程

  • 思考方向:用之前或者之后的状态,推导出 dp[i] 的状态

    • 之前:dp[i-1]dp[i-2]
    • 之后:dp[i+1]dp[i+2]
  • 经验:根据最近的一步,来划分问题

    • 要么先到 i-1 位置,然后支付 cost[i-1],走一步到达 i 位置==> dp[i-1] + cost[i-1]
    • 要么先到 i-2 位置,然后支付 cost[i-2],走两步到达 i 位置==> dp[i-2] + cost[i-2]
  • dp[i] = min((dp[i-1] + cost[i-1]), (dp[i-2] + cost[i-2]))

  1. 初始化

    • 保证填表的时候不越界
    • 初始化前两个位置
  2. 填表顺序

    • 从左向右(从左向右推)
  3. 返回值

    • 返回 dp[n]

解法二

就是换了一种状态表示

  1. 确定状态表示

    • 经验:以 i 位置为起点
    • 题目要求
    • dp[i] 表示从 i 出发,到达楼顶的最小花费
  2. 状态转移方程

  • 支付 cost[i] 之后,往后走一步,从 i+1 的位置出发,到达终点==> cost[i] + dp[i+1]

  • 支付 cost[i] 之后,往后走两步,从 i+2 的位置出发,到达终点==> cost[i] + dp[i+2]

  • dp[i] = min ((cost[i] + dp[i+1]), cost[i] + dp[i+2])

  1. 初始化
  • 因为需要用到 i+1i+2 位置的值,所以我们应该先初始化后面的值
  • dp[n-1] = cost[n-1]
  • dp[n-2] = cost[n-2]
  1. 填表顺序

    • 从右往左
  2. 返回值

    • min(dp[0], dp[1])

代码编写

解法一

public int minCostClimbingStairs(int[] cost) {  
    int n = cost.length;  
    int[] dp = new int[n+1];  
  
    for (int i = 2; i <= n; i++) {  
        dp[i] = Math.min((dp[i - 1] + cost[i - 1]), 
        (dp[i - 2] + cost[i - 2]));  
    }  
    return dp[n];  
}

解法二

public int minCostClimbingStairs2(int[] cost) {  
    int n = cost.length;  
    int[] dp = new int[n];  
  
    dp[n-1] = cost[n-1];  
    dp[n-2] = cost[n-2];  
  
    for (int i = n-3; i >= 0; i--) {  
        dp[i] = Math.min(dp[i+1], dp[i+2]) + cost[i];  
    }  
    return Math.min(dp[0],dp[1]);  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/894471.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

王爽汇编语言第三版实验3

实验任务 将下面的程序保存为t1.asm&#xff0c;将其生成可执行文件t1.exe 用Vscode编写源程序t1.asm 用脚本一键生成可执行文件t1.exe 成功运行 查看资源管理器&#xff0c;成功生成T1.obj与t1.exe文件‘ 用debug跟踪t1.exe的执行过程&#xff0c;写出每一步执行后&#xff…

基于SSM的大学校医院信息管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着高校规模的不断扩大和师生健康意识的增强&#xff0c;大学校医院面临着日益增长的医疗服务需求。传统的纸质病历、手工预约和药品管理方式已难以满足高效、准确和便捷的服务要求。因此&#xff0c;开发一套基于SSM&#xff…

021_Thermal_Transient_in_Matlab统一偏微分框架之热传导问题

Matlab求解有限元专题系列 固体热传导方程 固体热传导的方程为&#xff1a; ρ C p ( ∂ T ∂ t u t r a n s ⋅ ∇ T ) ∇ ⋅ ( q q r ) − α T d S d t Q \rho C_p \left( \frac{\partial T}{\partial t} \mathbf{u}_{\mathtt{trans}} \cdot \nabla T \right) \nab…

[计算机网络]第一周

TCP/IP 与OSI TCP/IP TCP/IP 四层模型是一个分层网络通信模型&#xff0c;它将网络通信过程分为四个层次&#xff0c;这四层分别是&#xff1a;网络接口层、互联网层、传输层和应用层。 网络接口层负责在计算机和网络硬件之间传输数据&#xff0c;负责在物理网络上发送和接收…

Cesium 影像加载的TileReplacementQueue技术

本文以分析QuadtreePrimitive及相关影像内容&#xff0c;讨论一些流程和方法。影像和地形是Cesium的基础内容&#xff0c;但是有时候感觉这部分的加载和渲染效率并不高。 TileReplacementQueue是一个非常神奇的类&#xff0c;我自己研究了小半天。虽然结构简单&#xff0c;但是…

鸿蒙HarmonyOS开发:应用权限的基本概念及如何申请应用权限详细介绍

文章目录 一、访问控制二、应用权限1、应用权限管控2、权限使用的基本原则3、授权方式4、权限等级 三、申请应用权限1、选择申请权限的方式2、声明权限3、声明样例4、二次向用户申请授权5、具体实现示例6、效果展示 四、应用权限列表1、system_grant&#xff08;系统授权&#…

【开源免费】基于SpringBoot+Vue.JS社区团购系统(JAVA毕业设计)

本文项目编号 T 024 &#xff0c;文末自助获取源码 \color{red}{T024&#xff0c;文末自助获取源码} T024&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

亿发工单,拯救制造企业的时间:工单也能这样高效

在制造企业的日常生产中&#xff0c;工单管理是一项至关重要的任务。它不仅直接关系到生产效率&#xff0c;还影响到整个生产链的运作。然而&#xff0c;许多制造企业在工单处理过程中面临效率低下、沟通不畅、任务分配混乱等诸多问题&#xff0c;这不仅拖慢了生产进度&#xf…

2024年软件设计师中级(软考中级)详细笔记【7】面向对象技术(下)23种设计模式(分值10+)

目录 前言阅读前必看 第七章 面向对象技术&#xff08;下&#xff09;7.3 设计模式&#xff08;固定4分&#xff09;7.3.1 设计模式的要素7.3.2 创建型设计模式7.3.2.1 Abstract Factory&#xff08;抽象工厂&#xff09;7.3.2.2 Builder&#xff08;生成器&#xff09;7.3.2.3…

软件工程的学习之详细绪论

软件的定义 软件是程序和所有使程序正确运行所需要的相关文档和配置信息。 Software Program Data Document 一、软件危机&#xff1a; 软件开发和维护过程中遇到的一系列严重问题。 二、具体表现&#xff1a; 1、产品不符合用户的实际需要&#xff1b; 2、软件开发生产率…

安装好的 Nginx 增加 nginx-module-vts 模块

目录 1. nginx-module-vts 准备 2.查看已安装的的 nginx 编译参数 3. 重新编译 nginx 添加 nginx-module-vts 模块 4. 验证 1. nginx-module-vts 准备 # 解压 unzip nginx-module-vts-master.zip # 将解压包移动到/usr/local/目录 mv nginx-module-vts-master /usr/local/ …

基于微信小程序的购物系统【附源码、文档】

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

Java生死簿管理小系统(简单实现)

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

Oracle漏洞修复 19.3 补丁包 升级为19.22

1.场景描述 上周末2024-10-12日,服务器扫出漏洞,希望及时修复。其中,oracle的漏洞清单如下,总结了下,基本都是 Oracle Database Server 的 19.3 版本到 19.20 版本和 21.3 版本到 21.11 版本存在安全漏洞,即版本问题。如: Oracle Database Server 安全漏洞(CVE-2023-22…

OpenMediaVault安装插件以及重置web控制台密码

常用插件&#xff08;可根据实际情况选择安装&#xff09; openmediavault-flashmemory&#xff1a;加载临时文件到内存&#xff0c;保护硬盘&#xff1b;openmediavault-fail2ban &#xff1a;扫描日志文件并禁止显示恶意迹象的IP-太多的密码错误&#xff0c;寻找漏洞等&…

Java面试宝典-并发编程学习02

目录 21、并行与并发有什么区别&#xff1f; 22、多线程中的上下文切换指的是什么&#xff1f; 23、Java 中用到的线程调度算法是什么&#xff1f; 24、Java中线程调度器和时间分片指的是什么&#xff1f; 25、什么是原子操作&#xff1f;Java中有哪些原子类&#xff1f; 26、w…

(11)(2.1.5) Currawong Velocity CAN ESCs(一)

文章目录 前言 1 哪里买 2 PiccoloCAN设置 前言 Currawong 的 Velocity 系列 ESC(Velocity range of ESCs)为航空航天领域提供了高度可靠的电机控制。 Currawong 的 Velocity 系列 ESC(

[k8s理论知识]3.docker基础(二)隔离技术

容器其实是一种沙盒技术&#xff0c;其核心是通过约束和修改进程的动态表现&#xff0c;为其创建一个边界。这个边界确保了应用与应用之间不会相互干扰&#xff0c;同时可以方便在不同的环境中迁移&#xff0c;这是PaaS最理想的状态。 程序是代码的可执行镜像&#xff0c;通常…

【思维导图】C语言—常见概念

hello&#xff0c;友友们&#xff0c;今天我们进入一个新的专栏——思维导图&#xff01; 思维导图帮助我们复习知识的同时建构出一个清晰的框架&#xff0c;我往后会不断更新各个专栏的思维导图&#xff0c;关注我&#xff0c;一起加油&#xff01; 今天我们回顾C语言中的常见…

技术分享:A-23OH型树脂在汽车涂装废溶剂回收中的应用

在当今汽车制造业竞争激烈的环境下&#xff0c;提高生产效率、降低成本的同时&#xff0c;满足环保要求已成为各制造商追求的核心目标。水性涂料因其环保、节能等多重优势&#xff0c;在汽车涂装领域的应用日益广泛。然而&#xff0c;随之而来的喷涂废溶剂处理问题也日益凸显。…