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

动态规划理论基础

什么是动态规划

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

所以动态规划中每一个状态一定是由上一个状态推导出来的这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的,

常见类型

基础问题

背包问题

打家劫舍

股票问题

子序列问题

动规的误区

递推公式不是最主要的,仅仅是一部分

DP数组

DP数组究竟表示什么意思以及下标的含义

DP数组如何初始化

DP数组遍历顺序

打印DP数组(查错debug)

递归如何debug

做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果

然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。

如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。

如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。

这样才是一个完整的思考过程,而不是一旦代码出问题,就毫无头绪的东改改西改改,最后过不了,或者说是稀里糊涂的过了

这也是我为什么在动规五步曲里强调推导dp数组的重要性。

举个例子哈:在「代码随想录」刷题小分队微信群里,一些录友可能代码通过不了,会把代码抛到讨论群里问:我这里代码都已经和题解一模一样了,为什么通过不了呢?

发出这样的问题之前,其实可以自己先思考这三个问题:

  • 这道题目我举例推导状态转移公式了么?
  • 我打印dp数组的日志了么?
  • 打印出来了dp数组和我想的一样么?

如果这灵魂三问自己都做到了,基本上这道题目也就解决了,或者更清晰的知道自己究竟是哪一点不明白,是状态转移不明白,还是实现代码不知道该怎么写,还是不理解遍历dp数组的顺序。

然后在问问题,目的性就很强了,群里的小伙伴也可以快速知道提问者的疑惑了。

注意这里不是说不让大家问问题哈, 而是说问问题之前要有自己的思考,问题要问到点子上!

大家工作之后就会发现,特别是大厂,问问题是一个专业活,是的,问问题也要体现出专业!

如果问同事很不专业的问题,同事们会懒的回答,领导也会认为你缺乏思考能力,这对职场发展是很不利的。

所以大家在刷题的时候,就锻炼自己养成专业提问的好习惯。

递归五部曲总结

DP数组定义以及下标的含义

递推公式

DP数组如何初始化

DP数组遍历顺序

打印DP数组(查错debug)

509. 斐波那契数列

文档讲解:代码随想录

题目链接:. - 力扣(LeetCode)

dp数组

一维或者二维用来做状态转移的dp数组

dp[i]:第i个斐波那契的数组

递推公式

dp[i] = dp[i-1] +dp[i-2]

dp数组如何初始化

dp[0]=1,dp[1]=1

遍历顺序

从前向后遍历,从i=2开始遍历

debug

如果有问题就打印dp数组

class Solution:
    def fib(self, n: int) -> int:
        dp = [1]*(n+1) #因为有f(n),所以数组长度是n+1
        dp[0]= 0
        for i in range(2,n+1): 
            dp[i] = dp[i-1] + dp[i-2]
        print(dp)
        return dp[n]

这个题目如何简单:dp数组的初始化和递推关系都已经给我们了,遍历顺序也是很直观

70. 爬楼梯

文档讲解:代码随想录

题目链接:. - 力扣(LeetCode)

爬到第一层楼梯有一种方法,爬到二层楼梯有两种方法(走一步或者直接走两步)。

那么第一层楼梯再跨两步就到第三层 ,第二层楼梯再跨一步就到第三层。

所以到第三层楼梯的状态可以由第二层楼梯 和 到第一层楼梯状态推导出来,那么就可以想到动态规划了。(当要爬到第三层时,我们已经在一层或者二层了,假设在一层,我们就还需要迈两个台阶,假设在第二层,只需迈一个台阶就可以,因为我们最后一步只能迈一步或者两步

为什么三阶台阶只和一阶和二阶有关系?因为一步只能迈一步或者二步

同理4阶只能由2阶或者3阶迈上来,2阶再走两步,3阶再走1步

递推:当前这个阶有几种方法依赖于前两种状态

dp数组

dp[i]:达到第i阶有dp[i]种方法

递推公式

dp[i] = dp[i-1] +dp[i-2]

dp数组如何初始化

dp[0]=0,dp[1]=1,dp[2]=2

遍历顺序

从前向后遍历,从i=3开始遍历

debug

如果有问题就打印dp数组

class Solution:
    def climbStairs(self, n: int) -> int:
        dp = [0]*(n+1) #因为有f(n),所以数组长度是n+1
        dp[1] = 1
        if n > 1:
            dp[2] = 2
        for i in range(3,n+1): #当前状态只依赖于前两个状态,可以进行压缩
            dp[i] = dp[i-1] + dp[i-2]
        print(dp)
        return dp[n]

 最后这个题的代码与上一题差不多,但是从题意中看不出来呢?因为dp数组的定义与递推关系在题目中并没有明说

746. 使用最小花费爬楼梯

文档讲解:代码随想录

题目链接:. - 力扣(LeetCode)

dp数组的定义

如何定义dp数组呢?

我们的目标是求到达顶楼的最小消耗,上图中可以看出下标为3代表我们达到了楼顶,下标对应的值就表示为达到这楼的消耗

所以dp数组的含义就表示:到达i位置的最小花费是dp[i]

递推公式

一步可以跳1个台阶或者两个台阶

i可以由i-1跳了一步得到,花费就是cost[i-1]  一共就是dp[i] + cost[i-1]

也可以由i-2跳了两步得到,花费就是cost[i-2] 一共就是dp[i-2] + cost[i-2]

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

dp数组如何初始化

初始位置可以选在0或1

dp[0] = 0,dp[1] = 0 

遍历顺序

从前向后遍历,从i=2开始遍历

debug

如果有问题就打印dp数组

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        dp = [0]*(len(cost)+1)
        for i in range(2,len(cost)+1):
            dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
        return dp[len(cost)]

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

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

相关文章

android-mvp模式

mvvm可以理解成使用databing的mvp模式,modleview 通过接口让view和Presenter层解耦 从图中就可以看出,最明显的差别就是view层和model层不再相互可知,完全的解耦,取而代之的presenter层充当了桥梁的作用,用于操作view…

技术面‍:前端代码是如何与服务器交互的

前言: 本篇文章主要是想讲解 .html 文件和 .CSS 文件在实际开发中和后端服务器交互最后上线的基础原理。 面向的人群🆕:是刚入行不久,且目前只会写前端业务代码而不清楚整个工作流的前端新人。我会从 0 开始一步一步带你理解整个…

Kubernetes(k8s) v1.30.1 本地集群部署 安装metallb 支持LoadBalancer 生产环境 推荐 BGP模式部署

1 metallb 安装参考:Kubernetes(k8s) v1.30.1 本地集群部署 默认不支持LoadBalancer metallb来解决-CSDN博客 2 删除 Layer 2 模式 配置 kubectl delete -f IPAddressPool.yaml kubectl delete -f L2Advertisement.yaml kubectl delete -f discuz-srv.yaml 3 配置 k8s Metal…

2024电工杯数学建模B题完整论文讲解(含每一问python代码+数据)

大家好呀,从发布赛题一直到现在,总算完成了2024电工杯数学建模B题大学生平衡膳食食谱的优化设计及评价完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 …

【Python】 XGBoost模型的使用案例及原理解析

原谅把你带走的雨天 在渐渐模糊的窗前 每个人最后都要说再见 原谅被你带走的永远 微笑着容易过一天 也许是我已经 老了一点 那些日子你会不会舍不得 思念就像关不紧的门 空气里有幸福的灰尘 否则为何闭上眼睛的时候 又全都想起了 谁都别说 让我一个人躲一躲 你的承诺 我竟然没怀…

SQL使用函数给多个分表添加同一字段

数据库中分表时,往往需要向多个分表中添加同一个字段,可以定义一个函数,每次调用这个函数向多个份表中添加同意字段。 1、创建函数示例: 在PostgreSQL中创建一个简单的函数 以下是一个在PostgreSQL中创建函数的简单示例&#x…

Mac安装 Intellij IDEA,亲测有效M1、M2可用

引言 最近开始学习使用spring boot写一个简单的后端项目,使用Intellij IDEA软件,Intellij IDEA为新用户提供了30天的免费试用。 方案 1.官网下载Intellij IDEA IntelliJ IDEA – the Leading Java and Kotlin IDE 或者直接网盘连接下载:…

OrangePi AIpro开箱评测

开箱评测 有幸受邀参与了CSDN与OrangePi组织的评测活动,今天刚收到快递。拆开快递能看到保护盒、电源、双头typec线这三样(充电器和线有保护膜的我先拆掉了) 打开保护盒,能看到上下两块黑色海棉包裹的开发板(保护得不…

三、Servlet基础

注:因为我并不完全是为了从0开始Java开发,因此,我这里先暂时跳过第二章服务器环境相关的内容,直接开始第三章的内容。 3.1、Servlet 的基本结构: ​ 下面的代码给出了一个基本的 Servlet ,它处理 GET 请求…

QtXlsx库编译使用

文章目录 一、前言二、Windows编译使用2.1 用法①:QtXlsx作为Qt的附加模块2.1.1 检验是否安装Perl2.1.2 下载并解压QtXlsx源码2.1.3 MinGW 64-bit安装模块2.1.4 测试 2.2 用法②:直接使用源码 三、Linus编译使用3.1、安装Qt5开发软件包:qtbas…

翻译《The Old New Thing》- Why are INI files deprecated in favor of the registry?

Why are INI files deprecated in favor of the registry? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071126-00/?p24383 Raymond Chen 2007年11月26日 为什么弃用 INI 文件而改用注册表? 欢迎,Slashdot的读…

【再探】设计模式—职责链模式、命令模式及迭代器模式

行为型设计模式研究系统在运行时对象之间的交互,进一步明确对象的职责。有职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式及访问模式共11种。 1 职责链模式 需求:1) 请求能被多…

2024可信赖的企业级生成式 AI 白皮书

来源:COPU&IBM: 近期历史回顾:

[随笔] 在CSDN的6周年纪念日随笔

纪念 转眼已过6年,大一的时候学习编程,潜水 CSDN 学习各类博文,才学浅薄就没有主动写博文记录自己的学习历程。 过了段时间刚刚到了大二,很喜欢 Todolist,意气风发的写下《一份清爽的编程计划》,哈哈。 …

新浪测试社招要个25K,第一次面大厂挂了

一面 1、讲下被测系统和你负责测试的模块功能? 2、为什么选择这个测试框架,这个测试框架有什么优缺点? 3、测试文件的目录,包含哪些包,这些之间是怎么调用的? 4、UI自动化和接口自动化都是怎么做的&…

FFmpeg之转码

文章目录 概述transcode小结 概述 上一篇说了主要的流程,也就是ffmpeg_parse_options的流程,如下图: 红色箭头的流程说的差不多了,接下来看看绿色框框,也就是transcode的流程。 transcode 还是先给出我画的流程图&…

SPSS之因子分析

SPSS中因子分析功能在【分析】--【降维】--【因子分析】中完成(在SPSS软件中,主成分分析与因子分析均在【因子分析】模块中完成)。 因子分析的求解通常从分析原始变量的协方差矩阵或相关矩阵着手。 (1)当变量取值的度…

纯CSS丝滑边框线条动画

在这个网站(minimal-portfolio-swart.vercel.app)发现一个不错的交互效果,用户体验效果很不错。如封面图所示,这个卡片上有一根白色的线条围绕着卡片移动,且在线条的卡片内部跟随这一块模糊阴影,特别是在线…

无线麦克风哪个品牌音质最好,揭示麦克风什么牌子的音质效果好!

​随着科技的不断发展,无线领夹麦克风已经成为现代演讲、演出和采访中不可或缺的工具。这种小巧便携的设备,能够让我们摆脱线缆的束缚,自由地在舞台上或讲台上移动,同时保持声音的清晰和稳定。在这篇文章中,我们将介绍…

国产操作系统上telnet命令详解 _ 统信 _ 麒麟 _ 中科方德

原文链接:国产操作系统上telnet命令详解 | 统信 | 麒麟 | 中科方德 Hello,大家好啊!今天给大家带来一篇在国产操作系统上使用telnet命令的详细介绍文章。telnet是一个经典的网络协议和工具,广泛用于测试和管理远程服务器。本文将详…