代码随想录刷题day38|斐波那契数爬楼梯最小花费爬楼梯

文章目录

  • day38学习内容
  • 一、动态规划理论基础
    • 1.1、动态规划理论基础的几个关键概念:
    • 1.2、动态规划五部曲
  • 二、斐波那契数
    • 2.1、动态规划五部曲
      • 2.1.1、 确定dp数组(dp table)以及下标的含义
      • 2.1.2、确定递推公式
      • 2.1.3、 dp数组如何初始化
      • 2.1.4、确定遍历顺序
      • 2.1.5、计算并返回最终结果
    • 2.2、代码
      • 2.2.1、为什么dp[0] = 0?
  • 三、爬楼梯
    • 3.1、动态规划五部曲
      • 3.1.1、 确定dp数组(dp table)以及下标的含义
      • 3.1.2、确定递推公式
      • 3.1.3、 dp数组如何初始化
      • 3.1.4、确定遍历顺序
      • 3.1.5、计算并返回最终结果
    • 3.2、代码
  • 四、最小花费爬楼梯
    • 4.1、动态规划五部曲
      • 4.1.1、 确定dp数组(dp table)以及下标的含义
      • 4.1.2、确定递推公式
      • 4.1.3、 dp数组如何初始化
      • 4.1.4、确定遍历顺序
      • 4.1.5、计算并返回最终结果
    • 4.2、代码
  • 总结
    • 1.感想
    • 2.思维导图


day38学习内容

day37主要内容

  • 斐波那契数
  • 爬楼梯
    最小花费爬楼梯

声明
本文思路和文字,引用自《代码随想录》

一、动态规划理论基础

1.1、动态规划理论基础的几个关键概念:

  1. 最优子结构(Optimal Substructure):一个问题的最优解包含其子问题的最优解。这意味着我们可以通过组合子问题的最优解来构造问题的最优解。

  2. 边界条件(Boundary Conditions):问题的最小子集,它们是无法再分解的,并且解决方案是显而易见的。这些条件是动态规划算法的起点。

  3. 状态转移方程(State Transition Equation):这是动态规划的核心,定义了从一个状态到另一个状态的转移规则。一个“状态”通常描述了解决问题的某个阶段,而状态转移方程描述了这些阶段如何转化。

  4. 备忘录法(Memoization):一种优化技术,用于通过存储之前计算的结果(即“记忆”这些结果)来避免重复计算。这通常用于递归解决方案中,以提高效率。

  5. 自底向上(Bottom-Up Approach):与递归(通常是自顶向下的)相反,自底向上的方法首先解决子问题,然后合并这些解决方案来解决更大的问题。这通常涉及到使用迭代而非递归,并且使用表格(数组或其他数据结构)来存储中间结果。

1.2、动态规划五部曲

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

二、斐波那契数

509.原题链接

2.1、动态规划五部曲

2.1.1、 确定dp数组(dp table)以及下标的含义

- dp[i]表示第i个数,和为dp[i]

2.1.2、确定递推公式

题意已经告诉你了。dp[i] = dp[i - 1] + dp[i - 2];,不用自己推导了。

2.1.3、 dp数组如何初始化

很明显。dp[0] = 0
dp[1] = 1

2.1.4、确定遍历顺序

从前向后遍历,没啥好说的

2.1.5、计算并返回最终结果

return dp[i]即可

2.2、代码

class Solution {
    public int fib(int n) {
        if (n < 2) {
            return n;
        }
        int[] dp = new int[n + 1];
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i < n + 1; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
}

2.2.1、为什么dp[0] = 0?

看题目。。
在这里插入图片描述


三、爬楼梯

70.原题链接

3.1、动态规划五部曲

3.1.1、 确定dp数组(dp table)以及下标的含义

- dp[i]表示到达第i个楼梯,有dp[i]种方法

3.1.2、确定递推公式

3.1.3、 dp数组如何初始化

很明显。dp[0] = 1
dp[1] = 1

3.1.4、确定遍历顺序

从前向后遍历,没啥好说的

3.1.5、计算并返回最终结果

return dp[i]即可

3.2、代码

class Solution {
    public int climbStairs(int n) {
        if (n < 2) {
            return n;
        }
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
}

四、最小花费爬楼梯

746.原题链接

4.1、动态规划五部曲

4.1.1、 确定dp数组(dp table)以及下标的含义

- dp[i] 表示到达第i层楼梯,最小成本为dp[i]。

4.1.2、确定递推公式

推导过程

  1. 定义状态:首先,我们定义 dp[i] 为到达第 i 阶楼梯所需的最小成本。

  2. 分析选择:对于每一阶楼梯 i(除了第一和第二阶),我们可以从第 i-1 阶或第 i-2 阶到达。这意味着到达第 i 阶的最小成本取决于:

    • 从第 i-1 阶上来的成本(即 dp[i-1] 加上 cost[i]),以及
    • 从第 i-2 阶上来的成本(即 dp[i-2] 加上 cost[i])。
  3. 确定状态转移方程:因此,为了计算 dp[i],我们需要选择这两种方式中成本更低的一种,即:
    dp[i] = min(dp[i-1], dp[i-2]) + cost[i]
    这里 dp[i-1] + cost[i] 代表了通过先支付到达第 i-1 阶的成本,再支付第 i 阶的成本来到达第 i 阶的总成本。类似地,dp[i-2] + cost[i] 代表了先支付到达第 i-2 阶的成本,再支付第 i 阶的成本的总成本。

4.1.3、 dp数组如何初始化

很明显。对于初始阶梯 dp[0]dp[1],因为没有前面的阶梯可以选择,所以它们的成本直接等于 cost[0]cost[1]

4.1.4、确定遍历顺序

从前向后遍历,没啥好说的

4.1.5、计算并返回最终结果

返回达到倒数第一阶和倒数第二阶中最小成本的那一个,因为这两个位置都可以直接到达楼梯顶端。
return Math.min(dp[cost.length - 1], dp[cost.length - 2]);
return Math.min(dp[cost.length - 1], dp[cost.length - 2])为什么不用加cost[i]

因为

  1. 问题定义:数组 cost 中的每个元素代表爬上对应阶梯的成本。一旦支付了爬上某阶梯的成本,你就可以站在那一阶上。而目标是以最小的成本到达楼梯的顶部,顶部位于 cost 数组之外的位置。

  2. 最终目标:考虑到你可以一次爬一阶或两阶,到达顶部的最后一步可以从倒数第一阶开始,也可以从倒数第二阶开始。这意味着在实际达到楼梯顶部时,并不需要支付额外的成本,因为你已经站在了可以直接到达顶部的阶梯上。

  3. 成本已包括:当计算 dp 数组时,每个 dp[i] 已经包含了到达第 i 阶所需的全部成本,包括爬上第 i 阶的成本。所以,到达倒数第一阶或倒数第二阶的成本已经计算在内,不需要再额外添加成本来完成最后一步的动作。

综上所述,选择 dp[cost.length - 1]dp[cost.length - 2] 中的最小值作为最终结果,是因为这两个值已经反映了到达楼梯顶部(实际是站在能够一步到达顶部的最后两阶楼梯上)的全部必要成本。这个设计巧妙地避免了在问题解决方案的最后一步中不必要的成本计算,直接利用了动态规划数组中的结果来找出达到楼梯顶部的最小成本。

4.2、代码

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

总结

1.感想

  • 动态规划的第一天,加油

2.思维导图

本文思路引用自代码随想录,感谢代码随想录作者。-

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

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

相关文章

数据结构——lesson11排序之快速排序

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

ASP.NET制作试卷(单选+多选)

需求&#xff1a; 1.包含单选题、多选题。 2.所有题做完再提交。 3.提示错误、统计分数&#xff08;提交后&#xff09;。 项目结构&#xff1a; 效果展示&#xff1a; 效果展示&#xff08;视频&#xff09;&#xff1a; ASP.NET练习1效果 index.aspx代码&#xff1a; &l…

排序---数组和集合

1、数组排序 Arrays.sort(int[] a)这种形式是对一个数组的所有元素进行排序&#xff0c;并且是按照从小到大的排序。 public static void main(String[] args) {Integer []arr {1,2,3,4,5,6};//升序Arrays.sort(arr);for (int x:arr){System.out.print(x " ");}Sys…

大学生租房系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 1. 系统功能…

ForkJoinPool、CAS原子操作

ForkJoinPool ForkJoinPool是由JDK1.7后提供多线程并行执行任务的框架。可以理解为一种特殊的线程池。 1.任务分割&#xff1a;Fork&#xff08;分岔&#xff09;&#xff0c;先把大的任务分割成足够小的子任务&#xff0c;如果子任务比较大的话还要对子任务进行继续分割。 …

C#手麻系统源码,医院手术麻醉信息系统源码,前端框架:Vue,Ant-Design,后端框架:百小僧开源框架

手术麻醉管理系统覆盖了从患者入院&#xff0c;经过术前、术中、术后&#xff0c;直至出院的全过程。医院手术麻醉系统能够规范麻醉科和手术室的工作流程、实现麻醉手术过程中的信息数字化和网络化、自动生成麻醉手术中的各种医疗文书、完整共享HIS、LIS和PACS等手术患者信息&a…

RPA机器人:人人都会实现的机器人

在这个数字化飞速发展的时代&#xff0c;微信已经成为我们日常生活和工作中不可或缺的社交工具。然而&#xff0c;随着联系人数量的不断增加&#xff0c;如何高效管理这些社交关系成为了许多人面临的挑战。今天&#xff0c;我要为大家介绍的&#xff0c;是一款能够彻底改变你微…

PHP实现单列内容快速查重与去重

应用场景:excel一列内容比如身份证号&#xff0c;可能有重复的&#xff0c; 则用此工具快速查询那些重复及显示去重后内容。 使用&#xff1a;粘贴一列数据&#xff0c;然后提交发送。 <?php $tm "单列查重去重(粘贴Excel中1列内容查重)!";function tipx($str…

WEB embedded APP (javafx)

WEB embedded APP &#xff08;javafx&#xff09; &#xff08;BS 嵌入CS&#xff09; CS嵌入BS_哔哩哔哩_bilibili

生信软件14 - bcftools提取和注释VCF文件关键信息

bcftools可用于变异信息的描述性统计&#xff0c;计算&#xff0c;过滤和格式转换。 1. 显示VCF文件的头信息 bcftools view -h sample.vcf##fileformatVCFv4.2 ##FILTER<IDPASS,Description"All filters passed"> ##bcftoolsVersion1.5htslib-1.5 ##bcftool…

vmware,linux,centos7,NAT模式下的网络配置

centos7的NAT网络配置 NAT模式说明虚拟机网络配置工具本机配置net8网络&#xff08;NAT的网域&#xff09;本机的IP配置(用于net8局域网内解析主机IP和域名对应关系使用)&#xff08;可选&#xff09;虚拟机内的网络配置虚拟机ping不通www.baidu.com的情况下虚拟机ping可以ping…

我劝你不要买29.99万的小米SU7

文 | AUTO芯球 作者 | 雷歌 我在想我是不是贱啊&#xff1f;&#xff01; 我昨晚兴奋得头晕脸热的&#xff0c;身边一众关注车的朋友&#xff0c;也感觉到了车圈过年的气氛。 原因就是小米SU7的价格公布了。 21.59万元起售价格出来以后&#xff0c;就好比新年0点一过的那个…

C++:sizeof关键字(7)

sizeof用于统计数据所占用内存的大小 用法&#xff1a;sizeof( 变量名称 / 变量) 直接上代码&#xff0c;可以在让大家直观的感受到sizeof关键字的用法 #include<iostream> using namespace std;// 语法&#xff1a; sizeof&#xff08;数据类型|变量名&#xff09;// 用…

PS从入门到精通视频各类教程整理全集,包含素材、作业等(2)

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 初级教程素材 等文件 https://www.alipan.com/s/fC…

从0到1利用express搭建后端服务

目录 1 架构的选择2 环境搭建3 安装express4 创建启动文件5 express的核心功能6 加入日志记录功能7 日志记录的好处本节代码总结 不知不觉学习低代码已经进入第四个年头了&#xff0c;既然低代码很好&#xff0c;为什么突然又自己架构起后端了呢&#xff1f;我有一句话叫低代码…

C++——vector类及其模拟实现

前言&#xff1a;前边我们进行的string类的方法及其模拟实现的讲解。这篇文章将继续进行C的另一个常用类——vector。 一.什么是vector vector和string一样&#xff0c;隶属于C中STL标准模板库中的一个自定义数据类型&#xff0c;实际上就是线性表。两者之间有着很多相似&…

安装docker 并搭建出一颗爱心树

1、docker介绍 Docker 是⼀个开源的容器运⾏时软件&#xff08;容器运⾏时是负责运⾏容器的软件&#xff09;&#xff0c;基于 Go 语 ⾔编写&#xff0c;并遵从 Apache2.0 协议开源。 Docker可以让开发者打包⾃⼰的应⽤以及依赖到⼀个轻量的容器中&#xff0c;然后发布到任何…

Python 垃圾回收和弱引用(Weakref)

Python中的赋值语句是建立变量名与对象的引用关系&#xff0c;多个变量可以引用同一个对象&#xff0c;当对象的引用数归零时&#xff0c;可能会被当作垃圾回收。而弱引用即可以引用对象&#xff0c;又不会阻止对象被当作垃圾回收&#xff0c;因此这个特性非常适合用在缓存场景…

值得收藏!2024年人工智能顶级会议投稿信息汇总(计算机视觉领域)

计算机视觉是人工智能领域的重要分支。它融合了图像处理、模式识别、机器学习和人工智能等多个领域的技术&#xff0c;旨在让计算机具备类似甚至超越人类视觉系统的能力。本文将精选介绍计算机视觉领域内的重要会议&#xff0c;包括会议主题、稿件提交的截止日期、会议的时间与…

SpringCloudConfig 使用git搭建配置中心

一 SpringCloudConfig 配置搭建步骤 1.引入 依赖pom文件 引入 spring-cloud-config-server 是因为已经配置了注册中心 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</…