【代码随想录算法训练营Day38】动态规划理论基础;509.斐波那契数;70.爬楼梯;746.使用最小花费爬楼梯

文章目录

  • ❇️Day 38 第九章 动态规划 part01
    • ✴️今日任务
    • ⏺️理论基础
      • 1. 什么是动态规划
      • 2. 动态规划题目类型
      • 3. 误区
      • 4. 动规五部曲
      • 5. 如何debug
    • ❇️509. 斐波那契数
      • 随想录思路
      • 自己的代码
    • ❇️70. 爬楼梯
      • 随想录思路
      • 自己的代码
    • ❇️746. 使用最小花费爬楼梯
      • 随想录思路
      • 自己的代码

❇️Day 38 第九章 动态规划 part01

✴️今日任务

今天正式开始动态规划!

  • 理论基础
  • 509.斐波那契数
  • 70.爬楼梯
  • 746.使用最小花费爬楼梯

⏺️理论基础

  • 无论大家之前对动态规划学到什么程度,一定要先看 我讲的 动态规划理论基础。
  • 如果没做过动态规划的题目,看我讲的理论基础,会有感觉 是不是简单题想复杂了?
  • 其实并没有,我讲的理论基础内容,在动规章节所有题目都有运用,所以很重要!
  • 如果做过动态规划题目的录友,看我的理论基础 就会感同身受了。
  • 视频讲解:https://www.bilibili.com/video/BV13Q4y197Wg
  • 文章链接:https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html

1. 什么是动态规划

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。

2. 动态规划题目类型

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

3. 误区

误以为重点只在搞懂递推公式,好多知识点都没弄明白,代码AC了但下一题还是不会做
需要搞清楚基本的解题逻辑和步骤
动态规划重要的不仅仅是递推公式

4. 动规五部曲

  1. 确定dp数组的含义(以及下标的含义)
  2. 递推公式
  3. 想清楚dp数组如何初始化
  4. dp数组的遍历顺序
  5. 打印dp数组(找错误)

5. 如何debug

做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果。
然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。
如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。
如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。
这样才是一个完整的思考过程,而不是一旦代码出问题,就毫无头绪的东改改西改改,最后过不了,或者说是稀里糊涂的过了。

❇️509. 斐波那契数

  • 很简单的动规入门题,但简单题使用来掌握方法论的,还是要有动规五部曲来分析。
  • 题目链接:https://leetcode.cn/problems/fibonacci-number/
  • 视频讲解:https://www.bilibili.com/video/BV1f5411K7mo
  • 文章链接:https://programmercarl.com/0509.%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0.html

好久没接触动规了,直接看视频熟悉一下

随想录思路

  1. 确定dp数组的含义(以及下标的含义)
    dp[i]:第i个斐波那契数的值为dp[i]
  2. 递推公式
    dp[i] = dp[i - 1] + dp[i - 2]
  3. 想清楚dp数组如何初始化
    dp[0] = 0; dp[1] = 1;
  4. dp数组的遍历顺序
    从前向后遍历
  5. 打印dp数组(找错误)

自己的代码

class Solution {public int fib(int n) {int dp[] = new int[n + 1];//优化:if (n <= 1) return n;      if(n == 0) return 0;if(n == 1) return 1;dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}//System.out.println(Arrays.toString(dp));return dp[n];}
}

❇️70. 爬楼梯

  • 本题大家先自己想一想, 之后会发现,和 斐波那契数 有点关系。
  • 题目链接:https://leetcode.cn/problems/climbing-stairs/
  • 视频讲解:https://www.bilibili.com/video/BV17h411h7UH
  • 文章链接:https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF.html

因为好久没接触动态规划,所以毫无头绪,直接看视频

随想录思路

一阶——1种
二阶——2种(1+1;2)
三阶——3种(因为一步只能上1阶or2阶,所以只能是从一阶走2步or从二阶走1步:1+2)
四阶——5种(只能是从二阶走2步or从三阶走1步:2+3)
所以等同于斐波纳契数

  1. 确定dp数组的含义(以及下标的含义)
    dp[i]:上到第i个阶梯有dp[i]种方法
  2. 递推公式
    dp[i] = dp[i - 1] + dp[i - 2]
  3. 想清楚dp数组如何初始化
    dp[0]无意义,所以直接从dp[1]开始
    dp[1] = 1; dp[2] = 2;
  4. dp数组的遍历顺序
    从前向后遍历
  5. 打印dp数组(找错误)

自己的代码

class Solution {public int climbStairs(int n) {int dp[] = new int[n + 1];if(n == 1) return 1;dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}//System.out.println(Arrays.toString(dp));return dp[n];} 
}

❇️746. 使用最小花费爬楼梯

  • 这道题目力扣改了题目描述了,现在的题目描述清晰很多,相当于明确说 第一步是不用花费的。
  • 更改题目描述之后,相当于是 文章中 「拓展」的解法
  • 题目链接:https://leetcode.cn/problems/min-cost-climbing-stairs/
  • 视频讲解:https://www.bilibili.com/video/BV16G411c7y
  • 文章链接:https://programmercarl.com/0746.%E4%BD%BF%E7%94%A8%E6%9C%80%E5%B0%8F%E8%8A%B1%E8%B4%B9%E7%88%AC%E6%A5%BC%E6%A2%AF.html

随想录思路

  1. 确定dp数组的含义(以及下标的含义)
    dp[i]表示到i层最少需要花费的钱,i最大是cost.length也就是最顶层
  2. 递推公式
    与上题思想一样
    dp[i] = Math.min(dp[i - 2] + cost[i - 2], dp[i - 1] + cost[i - 1]);
  3. 想清楚dp数组如何初始化
  4. dp[0] = 0
  5. dp[1] = 0
  6. dp数组的遍历顺序
    从前往后遍历
  7. 打印dp数组(找错误)

自己的代码

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python与FPGA——全局二值化

文章目录 前言一、Python全局128二、Python全局均值三、Python全局OTSU四、FPGA全局128总结 前言 为什么要进行图像二值化&#xff0c;rgb图像有三个通道&#xff0c;处理图像的计算量较大&#xff0c;二值化的图像极大的减少了处理图像的计算量。即便从彩色图像转成了二值化图…

view的两种实现方式

想通过一个小功能的实现来表达我对编程的一些看法 一个多列表选择框&#xff0c;我第一种方案用了一个自定义view逻辑全写在一个类里&#xff0c;一个小时内很快就搞定了 但我也清楚&#xff0c;会有很大一些人如果看这个代码&#xff0c;会觉得很乱&#xff0c;甚至看不懂&…

linux系统---selinux

目录 前言 一、SELinux 的作用及权限管理机制 1.SELinux 的作用 1.1DAC 1.2MAC 1.3DAC 和 MAC 的对比 2.SELinux 基本概念 2.1主体&#xff08;Subject&#xff09; 2.2对象&#xff08;Object&#xff09; 2.3政策和规则&#xff08;Policy & Rule&#xff09; …

强化学习中动作价值函数和状态价值函数的联系区别?

在强化学习中&#xff0c;动作价值函数&#xff08;Q函数&#xff09;和状态价值函数&#xff08;V函数&#xff09;都是值函数&#xff0c;用于评估在不同状态或状态动作对下的值。它们之间存在联系&#xff0c;但有一些区别&#xff1a; 动作价值函数&#xff08;Q函数&#…

Web自动化测试框架-PO模式

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Python接口自动化之cookie、session应用!

以下介绍cookie、session原理及在接口自动化中的应用。 HTTP 协议是一种无状态协议&#xff0c;即每次服务端接收到客户端的请求时&#xff0c;都是一个全新的请求&#xff0c;服务器并不知道客户端的历史请求记录&#xff1b;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的…

L2-002 链表去重(Java)

给定一个带整数键值的链表 L&#xff0c;你需要把其中绝对值重复的键值结点删掉。即对每个键值 K&#xff0c;只有第一个绝对值等于 K 的结点被保留。同时&#xff0c;所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15&#xff0c;你需要输出去重后…

对列表的元素进行验证

摘要&#xff1a;开发中经常需要校验用户提交的值是否满足要求&#xff0c;Valid可用于方法参数、返回值等的验证&#xff0c;但是对于参数为列表时无效&#xff0c;此处记录几种对列表进行验证的方法 Valid 注解通常用于验证单个对象的字段&#xff0c;而不是整个列表。仅添加…

NetSuite Mass Update 批量更新功能

NetSuite中有一个小而精的便捷功能&#xff0c;但是也是一个很容易在实践中被大家遗忘的隐藏功能&#xff0c;就是Mass Update批量更新&#xff0c;在此想和各位分享一下&#xff5e;该功能主要是可以帮助用户快速将符合固定标准的记录中的单个/多个字段直接进行批量更新。如果…

快速批量将图片变成圆角怎么弄?教你一键将图片批量加圆角

在我们日常工作中&#xff0c;在设计图片的时候会要求将直角变成圆角&#xff0c;那么为什么要这么做呢&#xff1f;首先从圆角的设计语言上来说说&#xff0c;圆角看起来很现代&#xff0c;传达给人的感觉是温和友善的&#xff0c;被广泛的应用在产品中的图标、按钮等地方。而…

旷视IPC网络摄像机RTSP地址规则

主码流&#xff1a;rtsp://10.231.20.55/live?profileProfile_0000 子码流&#xff1a;rtsp://10.231.20.55/live?profileProfile_0001 三码流&#xff1a;rtsp://10.231.20.55/live?profileProfile_0002 带用户名密码格式&#xff0c;主码流&#xff1a;rtsp://admin:pw…

OJ习题之——圆括号编码

圆括号编码 1.题目描述2.完整代码3.图例演示 1.题目描述 题目描述 令Ss1 s2 …sn是一个规则的圆括号字符串。S以2种不同形式编码&#xff1a; &#xff08;1&#xff09;用一个整数序列Pp1 p2 … pn编码&#xff0c;pi代表在S中第i个右圆括号的左圆括号数量。&#xff08;记为…

检测和处理异常之封装内建函数

​我们现在给出一个交互操作的例子 - 从最基本的错误检测开始, 然后逐步改进它, 增强代码的健壮性. 这里的问题是把一个用字符串表示的数值转换 为正确的数值表示形式, 而且在过程中要检测并处理可能的错误. float() 内建函数的基本作用是把任意一个数值类型转换为一个浮点数…

代码第二十四天-寻找旋转排序数组中的最小值Ⅱ

寻找旋转排序数组中的最小值Ⅱ 题目要求 解题思路 二分法 当遇到两个left、right两个位置值相同时候&#xff0c;可以选择将 right right-1 代码 class Solution:def findMin(self, nums: List[int]) -> int:left,right0,len(nums)-1while left<right:mid(leftright…

HarmonyOS—配置编译构建信息

在进行应用/服务的编译构建前&#xff0c;需要对工程和编译构建的Module进行设置。API Version 9、API Version 8与API Version 4~7的构建体系不同&#xff0c;因此在设置编译构建信息时也存在差异&#xff1a; API Version 9&#xff1a;需要对构建配置文件、构建脚本、应用依…

一文读懂HDMI的演变-从HDMI1.0到HDMI2.1(建议收藏)

HDMI&#xff0c;全称为&#xff08;High Definition Multimedia Interface&#xff09;高清多媒体接口&#xff0c;主要用于传输高清音视频信号。 HDMI System HDMI系统包括HDMI的source和HDMI的sink, 其中source 是源端&#xff0c;即信号的来源&#xff1b;Sink的接收端&a…

Keepalived群集

目录 一、Keepalive基础 1.1 vrrp技术 1.2 VRRP相关技术 1.3.VRRP工作过程 1.4.Keeplived、VRRP及其工作原理 1.5.Keepalived体系主要模块及其作用 1.6.配置LVSKeepalived高可用群集 配置NFS服务器192.168.52.110 192.168.52.120web1服务器 192.168.52.130web2服务器 配…

哇!!!!这个个人博客好好看!!!

做一个个人博客第一步该怎么做&#xff1f; 好多零基础的同学们不知道怎么迈出第一步。 那么&#xff0c;就找一个现成的模板学一学呗&#xff0c;毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题&#xff0c;那就是&#xff0c;那些模板都&#xff0c;太&#xff01;…

前端算法之归并排序

5、归并排序&#xff08;Merge Sort&#xff09; 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有…

C++性能优化 —— TCMalloc的原理与使用

一、TCMalloc简介 1、TCMalloc简介 TCMalloc(Thread-Caching Malloc&#xff0c;线程缓存的malloc&#xff09;是Google开发的内存分配算法库&#xff0c;最初作为Google性能工具库 perftools 的一部分&#xff0c;提供高效的多线程内存管理实现&#xff0c;用于替代操作系统…