目录

LeetCode 509. 斐波那契数

70. 爬楼梯

746. 使用最小花费爬楼梯

感想


文档讲解:代码随想录

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

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

解题步骤:

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

  2. 确定递推公式

  3. dp数组如何初始化

  4. 确定遍历顺序

  5. 举例推导dp数组

为什么要先确定递推公式,然后在考虑初始化呢?因为一些情况是递推公式决定了dp数组要如何初始化

做动规的题目,写代码之前一定要把状态转移在dp数组上的具体情况模拟一遍,心中有数,确定最后推出的是想要的结果。然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。

题目类型有基础题目、背包问题、打家劫舍、股票问题、子序列问题 五大类

LeetCode 509. 斐波那契数

文档讲解:代码随想录

视频讲解:手把手带你入门动态规划 | LeetCode:509.斐波那契数_哔哩哔哩_bilibili

状态:简单题,做对了,要注意特殊情况的处理,怎么返回

class Solution:def fib(self, n: int) -> int:if n == 0: # 边界条件return 0if n == 1:return 1dp = [0]*(n+1) # step1:dp数组 dp[i]是第i个斐波那契数的值dp[1] = 1 # step3:dp数组初始化for i in range(2, n+1): # step4:因为要用到前面的状态,所以遍历顺序从前向后dp[i] = dp[i-1] + dp[i-2] # step2:递推公式/状态转移方程return dp[n]

时间复杂度O(n)

空间复杂度O(n)

当前状态dp[i]只依赖前面两个状态dp[i-1]和dp[i-2],所以可以不用维护一整个数组,而是3个量就可以了,得到上面程序的精简版:

class Solution:def fib(self, n: int) -> int:if n <= 1:return ndp = [0]*2dp[1] = 1for i in range(2, n+1):sum = dp[0] + dp[1]dp[0] = dp[1]dp[1] = sumreturn dp[1]

 时间复杂度O(n)

空间复杂度O(1)

70. 爬楼梯

文档讲解:代码随想录

视频讲解:

状态:去年7月11日做过,一周年了,结果还是不会做。 想dp数组的定义,想了好久,不确定到底该怎么定义,到底是第i走了几个台阶 or 一共走了多少台阶 or 剩下多少台阶,但最后需要返回的是方法数量,这该咋办呢?

我的错误思路:

        # dp[i]是走完第i个台阶后,一共走了多少台阶# 递推公式 dp[i] = dp[i-1] + 1或2dp = [0] * n # 每次都走一个台阶,最多n步dp[0] = 1  # 但也有可能是2?if dp[-1] < n:  # 该确定遍历顺序了,怎么遍历?dp

正确思路是直接考虑每层楼梯的方法数目:

爬到第一层楼梯有一种方法,爬到二层楼梯有两种方法。

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

所以到第三层楼梯的状态可以由第二层楼梯 和 到第一层楼梯状态推导出来。

动规五部曲:

1. 一维数组 dp[i]: 爬到第i层楼梯,有dp[i]种方法

2. 递推公式:考虑最后一步走几个台阶,有两种情况1或者2。上i-1层楼梯,有dp[i - 1]种方法,那么再跳一个台阶就是dp[i];上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶就是dp[i]。 所以爬到第i层楼梯,有dp[i] = dp[i - 1] + dp[i - 2] 种方法。

3. 初始化:从dp数组定义的角度出发,不用考虑dp[0]的初始化,直接dp[1] = 1,dp[2] = 2,然后从i = 3开始递推

4. 从前向后遍历

5. 举例推导dp数组    1  2  3  5  8  13 

斐波那契数列:0、1、1、2、3、5、8、13、21、34……

与斐波那契数列后半截一样的

class Solution:def climbStairs(self, n: int) -> int:if n == 1:return ndp = [0]*(n+1) # 因为python下标从0开始,到n 长度为n+1dp[1] = 1dp[2] = 2for i in range(3,n+1):dp[i] = dp[i-1] + dp[i-2]return dp[n]

注意!一定要注意边界条件的处理!如果不写 if n==1: return n 的话,当n = 1时,dp[2] = 2 处就会报错list out of range。

空间和时间复杂度:O(n)  此题也可以像上一题一样优化空间复杂度为O(1)

拓展:这道题目还可以继续深化,就是一步一个台阶,两个台阶,三个台阶,直到 m个台阶,有多少种方法爬到n阶楼顶。这其实是一个完全背包问题,后面会讲。

746. 使用最小花费爬楼梯

文档讲解:代码随想录

视频讲解:

状态:自己做对了!类比上一题。

动规五部曲:

定义:dp[i]是到达第i个台阶需要支付的最少费用

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

初始化:dp[0] = 0   dp[1] = 0       题目中说 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯” 也就是相当于 跳到 下标 0 或者 下标 1 是不花费体力的

顺序:从前向后

举例:

cost = [1,100,1,1,1,100,1,1,100,1]

下标          0    1    2    3    4    5    6    7    8    9   楼顶

dp数组      0     0   1    2   2    3    3    4     4    5    6     确定dp数组长度为len(cost)+1

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

感想

学习用时:晚上2h + 晚上2h

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

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

相关文章

SpringMVC3

一、JSON 与参数传递1.1JSON 是什么- JSON 是字符串&#xff1a;比如 {"name":"zhangsan","password":"123456","age":15} 就是一个 JSON 字符串&#xff0c;它用来在前后端、服务间传递数据。- JSON 库&#xff1a;Fastj…

查看.bin二进制文件的方式(HxD十六进制编辑器的安装)

文章目录Windows 系统上安装 HxD 十六进制编辑器的步骤。**HxD 是一款免费、轻量级的工具&#xff0c;适合查看和编辑 .bin 等二进制文件。****PS:实际安装过程中会发现找不到Windows11的版本&#xff0c;安装windows10的即可&#xff0c;并且没有区别setup版和portable版**安装…

Linux系统性能优化与监控

系统性能优化与监控是保障 Linux 服务器稳定运行的核心技术&#xff0c;涉及 ​​CPU、内存、磁盘 I/O、网络、进程​​ 等多维度的指标分析、问题定位与优化策略。以下从​​监控工具与指标​​、​​常见问题诊断​​、​​优化方法​​三个层面详细讲解&#xff0c;并结合​…

如何在 React + TypeScript 中实现 JSON 格式化功能

如何在 React TypeScript 中实现 JSON 格式化功能 作为前端开发者&#xff0c;我们经常需要处理 JSON 数据。无论是 API 调试、配置文件编辑还是数据转换&#xff0c;能够格式化 JSON 是一项基本但非常有用的技能。本文将详细介绍如何在 React 和 TypeScript 环境中实现 JSON…

Mac连接服务器Docker容器全攻略

苹果电脑( macOS 系统 )连接服务器、配置容器,整体思路和 Linux 终端操作更贴近,以下结合 macOS 特点,详细分步说明,以 Docker 容器 + 常见 Linux 服务器( 如 CentOS、Ubuntu )为例: 一、连接服务器(SSH 方式, macOS 终端原生支持 ) 1. 准备信息 找运维或云平台…

【字节跳动】数据挖掘面试题0019:带货直播间推荐:现在有一个带货的直播间,怎么把它精准地推送给有需要的用户

文章大纲 带货直播间推荐系统:原理、算法与实践 一、推荐系统在带货直播中的重要性 二、数据收集与处理 1. 用户数据 2. 直播间数据 3. 用户行为数据 4. 数据处理与特征工程 三、推荐算法实现 1. 基于内容的推荐 2. 基于协同过滤的推荐 3. 基于知识图谱的推荐 4. 混合推荐算法…

Windows10笔记本电脑开启BIOS

文章目录什么是BIOS一、方案一&#xff1a;快捷键进入二、方案二&#xff08;推荐&#xff09;各品牌快捷键大全什么是BIOS BIOS 全拼为 BasicInputOutputSystem, 即基本输入/输出系统,是计算机中非常基础而且重要的程序。把这一段程序存放在一个不需要电源的记忆体(芯片)中,就…

NFS、iSCSI 和lnmp部署操作

目录 &#xff08;一&#xff09;基础配置 1.NFS服务安装 2.修改配置文件 3.重载配置文件 4.查看共享目录 5.客户端挂载 6.更换共享目录 7.基础实验 &#xff08;二&#xff09;布置lnmp平台 1.php 安装软件 检测 2.连接MySQL 测试 3.软件实施 软件安装配置 &…

Redis深度解析:从缓存原理到高并发实战

第一部分&#xff1a;Redis核心概念与架构设计1.1 Redis本质解析Redis&#xff08;Remote Dictionary Server&#xff09;作为开源的内存数据结构存储系统&#xff0c;其核心价值在于&#xff1a;内存优先架构&#xff1a;数据主要存储在内存中&#xff0c;读写性能达到10万 QP…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博类别信息爬取

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解架构搭建 视频在线地址&#xff1a; 2026…

GD32/STM32嵌入CMSIS-DSP的库(基于Keil)

当你要用到三角函数、开方、矩阵运算等复杂的数学运算时&#xff0c;可以选择用C库的math.h里面的函数&#xff0c;如果要求速度快的话就得用CMSIS-DSP库里面的函数了&#xff0c;因为CMSIS-DSP库充分运用了CM4内核的浮点运算单元&#xff08;若有&#xff09;和DSP相关的指令&…

页面登录阻止浏览器提醒是否保存密码

一、原因 使用input的type"password"类型&#xff0c;浏览器会提醒是否记住密码。 二、解决 取消type"password" 三、实现输入密码*代替 通过input输入框&#xff0c;监听输入值&#xff0c;进行替换成*符号&#xff0c;避免使用input的type"password…

【iOS】dyld加载流程——应用程序的加载

目录 前言 编译过程与动静态库 编译过程 动静态库 dyld &#x1f4cc; 什么是 dyld&#xff1f; dyld_shared_cache: dyld加载流程 _dyld_start dyldbootstrap::start dyld::main() 配置环境变量 共享缓存 主程序的初始化 插入动态库 link主程序 link动态库 弱…

从零开始,手把手教你本地部署Stable Diffusion AI绘画(Win最新版)

本号之前有发过一篇win平台的教程&#xff0c;由于是去年10月发布的&#xff0c;而Al绘画技术发展很快&#xff0c;那篇教程已经有些不适用了&#xff0c;有些同学执行到第二步就出错了。 应广大同学的期望&#xff0c;我更新一版新版详细教程。 一、前言 1.为什么要本地部署…

day21 力扣669. 修剪二叉搜索树 力扣108.将有序数组转换为二叉搜索树 力扣538.把二叉搜索树转换为累加树

修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0c;原有的父代子代关…

《设计模式之禅》笔记摘录 - 7.中介者模式

中介者模式的定义中介者模式的定义为&#xff1a;Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently…

Flutter:上传图片,选择相机或相册:wechat_assets_picker

图片选择功能&#xff1a;可选单张&#xff0c;或多张。 1、showModalBottomSheet&#xff08;选择相册/相机&#xff09; 2、WechatImagePicker&#xff08;选取图片&#xff09; 3、CompressMediaFile&#xff08;图片压缩&#xff09;1、ActionSheetUtilimport package:duca…

pytest--0

1 pytest 使用方式 pytest测试框架-- 基本功能使用详解 2 pytest-mock常用方式 pytest–1–pytest-mock常用的方法 3

multiprocessing.Pool 中的 pickle 详解

前言&#xff1a; 在 Python 的 multiprocessing.Pool 中&#xff0c;任务和数据需要通过序列化&#xff08;pickle&#xff09;传递给子进程。pickle 是 Python 的内置序列化模块&#xff0c;用于将 Python 对象转换为字节流&#xff0c;以便在进程间通信时传递。然而&#xf…

Java集合框架体系详解:List/Set/Map接口对比与核心实现原理

一、集合框架核心接口对比 1.1 List/Set/Map接口特性接口类型特性描述典型实现List有序可重复&#xff0c;支持索引访问ArrayList/LinkedListSet无序不可重复&#xff0c;基于哈希表或树实现HashSet/TreeSetMap键值对存储&#xff0c;键唯一值可重复HashMap/TreeMap核心差异&am…