day38 动态规划part1

509. 斐波那契数

简单
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。

class Solution {
    public int fib(int n) {
        if (n < 2) return n;

        int dpa = 0;
        int dpb = 1;
        int dpc = 0;

        for (int i = 2; i <= n; i++) {
            dpc = dpa + dpb;
            dpa = dpb;
            dpb = dpc;
        }

        return dpc;
    }
}

70. 爬楼梯

简单
提示
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

没做过的话觉得好难,其实是有规律的,因为每次只能跳一或者两个台阶,所以,要想跳到f(n),就必须跳到f(n - 1) 或者 f(n - 2),所以f(n) = f(n - 1) + f(n - 2) , 有人可能会讲,f(n - 1) 和 f(n - 2) 里有没有重合的跳法,因为f(n - 1) 必然经过 f(n - 2), 这就有点问题了,因为f(x) 表示爬到第 x 级台阶的方案数,题目让你求得是方案数,不是爬楼梯的步数。f(n) = f(n - 1) + f(n - 2) 不能再加2哈,因为你到了f(n - 1)只有这种方案能上楼,f(n - 2)同理,记住,是方案的数量,不是上楼的步数。不要去管f(n - 1) 和f(n - 2),有联系,是有联系,可以没让你去管啊,要管的事f(n) 的算法。说再多没用,自己模拟前4个台阶怎么算的就明白了。

在这里插入图片描述

在这里插入图片描述

class Solution {
    public int climbStairs(int n) {
        if (n < 3) return n;

        int step1 = 1;
        int step2 = 2;
        int step3 = 0;
        for (int i = 3; i <= n; i++) {
            step3 = step1 + step2;
            step1 = step2;
            step2 = step3;
        }

        return step3;
    }
}

746. 使用最小花费爬楼梯

简单
提示
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费

// 这个题也可以不用dp数组,就三个变量就行
class Solution {
    public int minCostClimbingStairs(int[] cost) {
        // dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]
        int[] dp = new int[cost.length + 1]; // 把顶层也算上,多分配一个空间
        dp[0] = dp[1] = 0; // 可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯,说明代价是0

        for (int i = 2; i <= cost.length; i++) {
            // 要么是从下面一个台阶跳上来的,要么是从下面两个台阶跳上来的,选代价最小的就行
            dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i- 2]);
        }

        return dp[cost.length];
    }
}

用这个题来捋捋思路:

1.确定dp数组以及下标的含义

使用动态规划,就要有一个数组来记录状态,本题只需要一个一维数组dp[i]就可以了。

dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]。

对于dp数组的定义,大家一定要清晰!

2.确定递推公式

可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]。

dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。

dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。

那么究竟是选从dp[i - 1]跳还是从dp[i - 2]跳呢?

一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);

3.dp数组如何初始化

看一下递归公式,dp[i]由dp[i - 1],dp[i - 2]推出,既然初始化所有的dp[i]是不可能的,那么只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]dp[1]推出。

那么 dp[0] 应该是多少呢? 根据dp数组的定义,到达第0台阶所花费的最小体力为dp[0],那么有同学可能想,那dp[0] 应该是 cost[0],例如 cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] 的话,dp[0] 就是 cost[0] 应该是1。

这里就要说明本题力扣为什么改题意,而且修改题意之后 就清晰很多的原因了。

新题目描述中明确说了 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。” 也就是说 到达 第 0 个台阶是不花费的,但从 第0 个台阶 往上跳的话,需要花费 cost[0]。

所以初始化 dp[0] = 0,dp[1] = 0;

4.确定遍历顺序

最后一步,递归公式有了,初始化有了,如何遍历呢?

本题的遍历顺序其实比较简单,简单到很多同学都忽略了思考这一步直接就把代码写出来了。

因为是模拟台阶,而且dp[i]由dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组就可以了。

但是稍稍有点难度的动态规划,其遍历顺序并不容易确定下来。 例如:01背包,都知道两个for循环,一个for遍历物品嵌套一个for遍历背包容量,那么为什么不是一个for遍历背包容量嵌套一个for遍历物品呢? 以及在使用一维dp数组的时候遍历背包容量为什么要倒序呢?

这些都与遍历顺序息息相关。当然背包问题后续「代码随想录」都会重点讲解的!

5.举例推导dp数组

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

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

相关文章

PR:添加MTV动态歌词

MTV的歌词效果如下&#xff1a; 1.用文字工具编辑歌词&#xff0c;选择合适的字体 2.点中素材&#xff0c;按住Alt键向上拖拽复制一份 3.文字填充色选择蓝色&#xff0c;描边选择白色加粗 4.添加不透明度蒙版&#xff0c;拖拽至歌词前面 5.打开蒙版路径前的秒表 6.在歌词结尾处…

C语言实现回调函数

C语言实现回调函数 一、回调函数概念1.1 什么叫函数指针 二、回调函数案例 一、回调函数概念 回调函数就是一个被作为参数传递的函数。在C语言中&#xff0c;回调函数只能使用函数指针实现&#xff0c;在C、Python、ECMAScript等更现代的编程语言中还可以使用仿函数或匿名函数…

unity学习(49)——服务器三次注册限制以及数据库化角色信息4--角色信息数据库化

1.此处下断开始调试,list函数内就有问题&#xff1a; 2. 现在的问题是只读不写&#xff01;32行就是写入部分的代码&#xff1a; 3. 很奇怪&#xff0c;调试的时候确实是写进来了 程序正常执行后&#xff0c;文件中数据也没有消失 关闭服务器文件内容依旧正常。 players包含所…

【深度学习笔记】6_2 循环神经网络RNN(recurrent neural network)

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 6.2 循环神经网络 上一节介绍的 n n n元语法中&#xff0c;时间步 t t t的词 w t w_t wt​基于前面所有词的条件概率只考虑了最近时间…

APP测试功能点总结

1、功能性测试&#xff1a; 根据产品需求文档编写测试用例。 软件设计文档编写用例。  注意&#xff1a;就是根据产品需求文档编写测试用例而进行测试。 2、兼容性测试: Android版本的兼容性 手机分辨率兼容性 网络的兼容性&#xff1a;2G\3G\4G\WIFI,弱网下、断网时 APP跨…

Newman基本使用

简介 Newman 是 Postman 推出的一个 nodejs 库&#xff0c;直接来说就是 Postman 的json文件可以在命令行执行的插件。   Newman 可以方便地运行和测试集合&#xff0c;并用之构造接口自动化测试和持续集成。 安装 安装需要通过 npm 命令来完成&#xff0c;可以直接安装 nod…

ai克隆配音!AI大模型应用开发带来的惊喜

AI大模型应用开发的进步给我们带来了许多惊喜。随着技术不断发展&#xff0c;AI克隆配音已经成为一种热门趋势。这项技术不仅可以为影视作品提供更加优质和多样化的配音选择&#xff0c;还可以帮助演员和制片人节省大量时间和精力。 通过AI克隆配音技术&#xff0c;只需输入一…

【方法】如何打开7Z分卷压缩文件?

什么是7Z分卷压缩文件&#xff1f;就是在压缩文件时&#xff0c;将文件压缩成若干个大小一样、以“文件名.7z.序号”格式命名的7Z压缩包&#xff0c;可以方便存储和传输&#xff0c;如下图所示。 一、7Z分卷压缩文件如何打开&#xff1f; 我们只需要按照普通压缩包的打开方式&…

为什么大学讲授 C 语言比讲授 C++ 的更多?

为什么大学讲授 C 语言比讲授 C 的更多&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&#xff0c;让我不断提升自己&…

moi3D安装

下载文件双击文件 下一步 同意下一步 下一步 下一步 下一步 安装下一步 完成 破解 将如图中的文件复制到文件目录下 汉化 在目录中进入ui文件夹下 在安装包中找到如下的文件复制到ui目录下 在打开 另存为 另存为时改一下编码格式如图 打开软件 找到如图options进入…

【广度优先搜索】【图论】【并集查找】2493. 将节点分成尽可能多的组

作者推荐 视频算法专题 本文涉及知识点 广度优先搜索 图论 并集查找 LeetCod2493. 将节点分成尽可能多的组 给你一个正整数 n &#xff0c;表示一个 无向 图中的节点数目&#xff0c;节点编号从 1 到 n 。 同时给你一个二维整数数组 edges &#xff0c;其中 edges[i] [ai…

LLMs在BI中的运用

现有的BI分析存在以下一些问题&#xff1a; 原始数据入库规整要求比较高。业务过程产生的数据需要经过一些清洗等前置处理后才能够进行后续的BI分析使用。业务部门的数据分析过度依赖于技术部门。而业务与技术之间由于对分析需求理解上的差异&#xff0c;往往需要繁琐的沟通与…

基于SSM的大王门店管理系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 SSM 3 1.1.1 Spring 3 1.1.2 Spring MVC 3 1.1.3 MyBatis 4 1.2 Shiro 4 1.3 前端技术 4 1.3.1 Bootstrap 4 1.3.2 jQuery 4 1.3.3 Ajax 5 1.3.4 Layui 5 1.3.5 Thymeleaf 5 1.4 本章小结 6 2 系统分析 7 2.1 功能需求分析…

【web网页制作】html+css网页制作企业网站办公用品主题(3页面)【附源码】

企业网站目录 涉及知识写在前面一、网页主题二、网页效果Page1、主页Page2、用品展示Page3、关于我们 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 四、网页源码4.1 主页模块源码4.2 源码获取方式 作者寄语 涉及知识 办公用品企业主题HTML网页制作&#xff0c;…

2024pytest自动化测试框架学习(一)

pytest是一个使构建简单和可扩展测试变得容易的框架。测试具有表现力和可读性-不需要样板代码。数分钟内即可开始为您的应用程序或库进行小型单元测试或复杂的功能测试。 一、安装 使用在线安装命令&#xff1a; pip install -U pytest (参数-U代表如果你已经安装了pytest&…

限制员工上网行为,如何有效管控员工上网行为? 你一定想不到这个方法!

发现员工上班时间刷抖音&#xff1a; 面对这种情况&#xff0c;领导不得火冒三丈&#xff1f;&#xff1f;&#xff1f; 对于员工不恰当的上网行为&#xff0c;非常有可能导致工作效率低下、安全风险增加以及企业形象受损。 因此应该采取一些措施来对员工上网行为进行管理。 …

NTP协议介绍

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 网络时间协议NTP&#xff08;Network Time Protocol&#xff09;是TCP/IP协议族里面的一个应用层协议&#xff0c;用来使客户端和服务器之间进行时…

浅谈碳化硅MOSFET TO-247封装单管引入开尔文管脚必要性

相较于传统的硅MOSFET和硅IGBT 产品&#xff0c;基于宽禁带碳化硅材料设计的碳化硅 MOSFET 具有耐压高、导通电阻低&#xff0c;开关损耗小的特点&#xff0c;可降低器件损耗、减小产品尺寸&#xff0c;从而提升系统效率。而在实际应用中&#xff0c;我们发现&#xff1a;带辅助…

Navicat安装破解教程

蓝奏云下载地址https://wws.lanzoux.com/b01tqirzc或者链接https://pan.baidu.com/s/15cfQAFdQsn8xSg_2LiQZHg 提取码&#xff1a;q3rd链接&#xff1a;https://pan.baidu.com/s/1WwyCC03qcnqnWKGo-m6ZjA 提取码&#xff1a;pg9uNavicat16目前没有破解方法&#xff0c;15可以&a…

Ant Design Vue 修改Model弹框 样式不生效

今天在使用 Ant Design Vue 组件库中又踩了一个坑 其他的样式都可以更改&#xff0c;唯独更改 Model 弹框组件的样式一直不生效 于是研究了好久才找到样式不生效的原因 最后又折腾了好久&#xff0c;参考了不少资料才得出的解决方案&#xff1a;