代码随想录算法训练营第四十一天|动态规划理论基础、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+1dp[0]= 0for 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+1dp[1] = 1if n > 1:dp[2] = 2for 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)]

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

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

相关文章

X2Doris使用指南:界面化数据迁移工具 - 轻松实现整库迁移至Doris

什么是X2Doris X2Doris 是 SelectDB 团队开发的,专门用于将各种离线数据迁移到 Apache Doris 中的核心工具,该工具集 自动建 Doris 表 和 数据迁移 为一体,目前支持了 Apache Doris/Hive/Kudu/StarRocks 数据库往 Doris 或 SelectDB Cloud 迁…

Oracle AVDF(审计保险库和数据库防火墙)常见问题

此文是AVDF FAQ的翻译注解(斜体) 通用问题 审计库和数据库防火墙的最新版本是什么? Oracle Audit Vault 和 Database Firewall (AVDF) 的最新版本是版本更新 11 (AVDF 20.11)。请阅读公告博客和发行说明以了解更多详细信息。 Oracle Audit …

一屏万象,场景无限:蓝牙墨水屏标签多功能多场景应用带您领略未来

在数字化浪潮汹涌澎湃的今天,智能科技产品层出不穷,它们不仅极大地改变了我们的生活方式,更在无形中拓宽了我们的视野。而今,一款融合了创新技术与实用性于一体的蓝牙墨水屏标签,正以其多功能多场景应用的特性&#xf…

在GoDaddy网站托管上托管Next.js , npm项目步骤

要在GoDaddy网站托管上托管一个使用Next.js构建的npm项目,步骤: 1. 准备Next.js项目 确保Next.js项目已经准备好,并且可以在本地运行。可以使用以下命令来启动项目: npm install npm run build npm start2. 设置GoDaddy主机 登…

strstr的使⽤和模拟实现

strstr(function) Returnsa pointer to the irst occurrence of str2 in str1, or a null pointer if str2 is not part of str1. (函数返回字符串str2在字符串str1中第⼀次出现的位置)。 The matchingprocess doesnot include t…

无线麦克风什么品牌好?一文读懂无线领夹麦克风哪个品牌音质最好

​当我们谈论到演讲、表演或者录制视频时,一个高质量的无线麦克风能够使得整个体验提升至一个全新的水平。它不仅能够保证声音的清晰度和真实度,还能够让使用者在演讲或者表演时更加自信和舒适。基于对市场的深入研究和用户体验的考量,我挑选…

在微信公众号怎么添加留言板功能

在如今信息爆炸的时代,微信公众号已成为企业与用户互动的重要桥梁。如何在这个平台上脱颖而出,吸引用户的眼球,提升用户黏性,成为每一个公众号运营者都需要思考的问题。今天,我们就来聊聊如何在微信公众号中巧妙添加留…

车辆相关识别API优化您的车辆系统

车辆相关识别API是开发者们所需的重要工具,它们基于先进的计算机视觉和深度学习技术,提供了强大的车辆识别和分类能力。这些API能够从图像或视频中快速准确地识别和提取车辆的关键信息,如车辆型号、品牌、颜色等。对于开发者而言,…

1251. 平均售价

1251. 平均售价 题目链接:1251. 平均售价 代码如下: # Write your MySQL query statement below select p.product_id,round(ifnull(sum(units*price)/sum(units),0),2) as average_price from Prices as p left join UnitsSold as u on p.product_id…

机器学习:探索数据的魔法世界

课程链接:AI小天才:让你轻松掌握机器学习 引言: 在当今数字化的时代,数据无处不在,而机器学习则是解析、理解和利用这些数据的魔法钥匙。从自动驾驶到智能推荐系统,机器学习的应用无所不在,给我…

k8s问题

文章目录 本地搭K8s集群 bilibili什么是声明式API?kubectl apply Etcd数据库有什么特性,为什么K8S选用了Etcd数据库?K8S中一个node的生命周期是怎样的?服务发现机制介绍docker的实现原理介绍如果只是使用Linux命名空间进行分离&am…

【深度学习】最强算法之:人工神经网络(ANN)

人工神经网络ANN 1、引言2、人工神经网络(ANN)2.1 定义2.1.1 定义2.1.2 应用场景 2.2 核心原理2.3 实现方式2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝:鱼哥,看新闻没? 小鱼:新闻天天看,啥事大惊小怪的。 小屌…

Python数据分析-心脏病(随机森林预测分析)

本次案例分析用心脏病数据集来做随机森林模型预测 导入基本的数据分析包 import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score…

【Python】【报错解决】【无法安装socket库】No matching distribution found for socket

一、问题描述 如下图,笔者在做一个安全相关的项目时,遇到如下报错: No matching distribution found for socket 在尝试安装socket(套接字)库时报错,报错代码: pip install socket二、原因及解…

【信息论系列2】蜂窝通信得基本概念和信道容量等相关计算

基本概念 已经看到,为了确保完全的区域覆盖而没有死点,可以使用一系列正多边形。 出于经济原因,通常采用六边形(六边形的设计比正方形或三角形更有效)。基于简单几何,相邻六边形之间的中心到中心的距离 x x x由 3 R \sqrt{3}R

【Lexus.4】Executive Sedan——Dismantling Follow-up

文章目录 碰撞测试前后防撞钢梁偏置碰撞A/B/C柱,边梁抗拉、屈服强度 底盘发动机轮上马力零部件供应商 来自2021《懂车大爆炸》——是一档为汽车爱好者、购车者和对汽车结构感兴趣的人提供的专业、生动的教学视频。它通过全拆散的方式,让观众更直观地了解…

路由引入实验(思科)

华为设备参考:路由引入实验(华为) 技术简介 路由引入技术在网络通信中起着重要的作用,能够实现不同路由协议之间的路由传递,并在路由引入时部署路由控制,实现路径或策略的控制 实验目的 不同的路由协议之…

抽样方法你真的懂么?

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:抽样方法的魅力与挑战 二、有放回抽样与无放回抽样的比较 1. 有放回抽…

高级优化理论与方法(十三)

高级优化理论与方法(十三) Non-linear Constrained OptimizationCase 1DefinitionExample 1Example 2 Necessary/Sufficient ConditionsDefinitionExample TheoremFONC(Lagranges Condition)2-DimensionalSummary:Lagranges Theorem[FONC] Lagranges Fun…

关于flask的错误:ImportError: cannot import name ‘Flask

学习flask框架的时候报错ImportError: cannot import name ‘Flask’ 可尝试如下两种方法解决: 方法一:若没安装过flask,则进入cmd,输入pip install flask 方法二:若安装过flask,则看文件名是否是flask …