代码随想录学习Day 33

动态规划理论基础

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。

例如:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。动态规划中dp[j]是由dp[j-weight[i]]推导出来的,然后取max(dp[j], dp[j - weight[i]] + value[i])。但如果是贪心呢,每次拿物品选一个最大的或者最小的就完事了,和上一个状态没有关系。所以贪心解决不了动态规划的问题。

动态规划五部曲:

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

确定递推公式

dp数组如何初始化

确定遍历顺序

举例推导dp数组

在代码中找问题的最好方式就是把dp数组打印出来,看看究竟是不是按照自己思路推导的!

509.斐波那契数

题目链接

讲解链接

递归解法:

class Solution:def fib(self, n: int) -> int:if n == 0 or n == 1:return nelse:return self.fib(n - 1) + self.fib(n - 2)

动态规划:

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[i] = dp[i - 1] + dp[i - 2]中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的;

5.举例推导dp数组:按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],当n为10的时候,dp数组应该是:0 1 1 2 3 5 8 13 21 34 55。

class Solution:def fib(self, n: int) -> int:if n <= 1:return ndp = [0] * (n + 1)  # 创建dp数组dp[0], dp[1] = 0, 1  # dp数组初始化for i in range(2, n + 1):  # 从前向后遍历dp[i] = dp[i - 1] + dp[i - 2]return dp[n]

70.爬楼梯

题目链接

讲解链接

动规五部曲:

1.确定dp数组以及下标的含义:dp[i]爬到第i层楼梯,有dp[i]种方法;

2.确定递推公式:从dp[i]的定义可以看出,dp[i] 可以有两个方向推出来。首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶就是dp[i]。还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶就是dp[i]。那么dp[i] = dp[i - 1] + dp[i - 2]

3.dp数组如何初始化:dp[i]的定义:爬到第i层楼梯,有dp[i]种方法。所以dp[1] = 1,dp[2] = 2,然后从i = 3开始递推;

4.确定遍历顺序:从递推公式dp[i] = dp[i - 1] + dp[i - 2]可以看出,遍历顺序一定是从前向后遍历的

5.举例推导dp数组:举例当n为5的时候,dp table(dp数组)应该是1 2 3 5 8.

class Solution:def climbStairs(self, n: int) -> int:  # 与斐波那契数基本一致if n <= 2:return ndp = [0] * (n + 1)dp[0], dp[1], dp[2] = 0, 1, 2for i in range(3, n + 1):dp[i] = dp[i - 1] + dp[i - 2]return dp[n]

746.使用最小花费爬楼梯

题目链接

讲解链接

动归五部曲:

1.确定dp数组及其下标含义:dp[i]表示的是爬到第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] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);

3.dp数组如何初始化:dp[0] = 0,dp[1] = 0;

4.确定遍历顺序:因为dp[i]由dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组;

5.举例推导dp数组:例2对应的dp数组为[0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6]。

class Solution:def minCostClimbingStairs(self, cost: List[int]) -> int:dp = [0] * (len(cost) + 1)  # 创建dp数组并初始化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[-1]  # 最后一项为爬到楼顶的消耗

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

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

相关文章

[Collection与数据结构] Map与Set(一):二叉搜索树与Map,Set的使用

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

python socket通讯 学习记录

python socket 1. 初级实现2. 添加header3. 中级实现&#xff08;引用pickle库&#xff09;4. 高级实现&#xff08;相互发送信息&#xff09;5. 一点尝试5. 1个server对应2个client5.2个server对应1个client 名称版本python3.11 本文涉及到socket的server与client通讯从简单到…

LeetCode 257. 二叉树的所有路径

LeetCode 257. 二叉树的所有路径 1、题目 题目链接&#xff1a;257. 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root…

java.net.SocketInputStream.socketRead0 卡死导致 tomcat 线程池打满的问题

0 TL;DR; 问题与原因&#xff1a;某些特定条件下 java.net.SocketInputStream.socketRead0 方法会卡死&#xff0c;导致运行线程一直被占用导致泄露采用的方案&#xff1a;使用监控线程异步监控卡死事件&#xff0c;如果发生直接关闭网络连接释放链接以及对应的线程 1. 问题 …

【视频格式转换】【ffmepg】对mp4文件进行重新编码输出新的mp4文件

【视频格式转换】【ffmepg】对mp4文件进行重新编码输出新的mp4文件 背景 之前开发调试了个能正常调用ffmpeg解码mp4文件得到yuv数据的testbed(把ffmpeg开源库移植并交叉编译到一个嵌入式平台)&#xff0c;用了好几年了&#xff0c;今天用来挂测一批新的采集视频mp4文件&#x…

nacos下载安装和nacos启动报错

nacos简介: Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您…

YOLOv9中模块总结补充|RepNCSPELAN4详图

专栏地址&#xff1a;目前售价售价69.9&#xff0c;改进点70 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 1. RepNCSPELAN4详图 RepNCSPELAN4是YOLOv9中的特征提取-融合模块&#xff0c;类似前几…

【数据结构-二叉搜索树的增删查改】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a;基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 …

C#面试题: 寻找中间值

给定一个数组&#xff0c;在区间内从左到右查找中间值&#xff0c;每次查找最小值与最大值区间内的中间值&#xff0c;且这个区间元素数量不小于3。 例如 1.给定数组float[] data { 1, 2.3f, 4, 5.75f, 8.125f, 10.5f, 13, 15, 20 } 输出&#xff1a;10.5、5.75、4、2.3、8…

[虚拟机+单机]梦幻契约H5修复版_附GM工具

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 视频演示 [虚拟机单…

vue2人力资源项目2登录接口、跳转主页

用户名和密码 解决跨域问题 1.在vue.config.js里配置 proxy: {// 如果请求地址里有api&#xff0c;就转成这个地址/api: {target: https://heimahr.itheima.net/}}// before: require(./mock/mock-server.js)}, axios封装 utils/request.js import axios from axios// creat…

Linux-信号执行

1. 信号什么时候被处理 当进程从内核态返回到用户态的时候&#xff0c;进行信号的检测和处理 什么内核态&#xff0c;什么又是用户态呢&#xff1f; 当进程在CPU上运行时&#xff0c;内核态&#xff1a;允许进程访问操作系统的代码和数据&#xff0c;用户态&#xff1a;进程只…

导航栏与内容板块联动

目的&#xff1a; 实现点击导航栏内容页面滑动到对应内容区域页面滑动到某一区域&#xff0c;导航栏对应内容颜色发生改变 HTML代码&#xff1a; 导航栏设置id&#xff0c;内容区域设置对应id&#xff0c;实现查询 <nav><ul><li><a href"#sectio…

【C++风云录】解码气象数据:六大工具的对比分析

天气研究和预测模型 前言 在这个高度依赖科技的时代&#xff0c;预测和理解天气模式已成为重要的需求。本文将探讨六种不同的大气研究和数据处理工具&#xff1a;WRF, MeteoIO, NetCDF, CDO, UCSimply 和 GribApi。这些工具都分别介绍了概述&#xff0c;功能特性以及使用案例…

户口本翻译件怎么处理?

户口本是中国公民的重要证件&#xff0c;由中华人民共和国公安部精心制作&#xff0c;不仅是国内身份的凭证&#xff0c;更是走向世界的一张关键名片。对于想出国留学 、追求移民生活或是追寻异国风情的旅行者来说&#xff0c;户口本翻译件都是不可或缺的一部分。那么&#xf…

2024OD机试卷-查找众数及中位数 (java\python\c++)

题目:查找众数及中位数 题目描述 众数是指一组数据中出现次数量多的那个数,众数可以是多个。 中位数 是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除 以2,所得的结…

Duplicate entry ‘asdfg‘ for key ‘clazz.name‘

Mybatis:java.sql.SQLIntegrityConstraintViolationException:Duplicate entry ‘asdfg’ for key ‘clazz.name’ 违反了数据库的唯一约束条件&#xff0c;即插入数据的时候具有唯一约束&#xff08;被unique修饰&#xff09;的列值重复了 在修改的过程中发生错误&#xff0c;…

【LLM 论文】Least-to-Most Prompting 让 LLM 实现复杂推理

论文&#xff1a;Least-to-Most Prompting Enables Complex Reasoning in Large Language Models ⭐⭐⭐ Google Research, ICLR 2023 论文速读 Chain-of-Thought&#xff08;CoT&#xff09; prompting 的方法通过结合 few-show prompt 的思路&#xff0c;让 LLM 能够挑战更具…

蓝桥青少一月 STEMA-Python 测评第一题

第一题&#xff08;难度系数 2&#xff0c;18 个计分点&#xff09; (注.input()输入函数的括号中不允许添加任何信息) 编程实现&#xff1a; 给定一个正整数 N&#xff0c;输出 N 除以 3 的商。 输入描述&#xff1a;输入一个正整数 N 输出描述&#xff1a;输出 N 除以 3 的商…

2024年抖音小店最新起店玩法,比你报的上万课程都有用!

大家好&#xff0c;我是电商糖果 刚开店的朋友&#xff0c;一定会遇到出单难&#xff0c;店铺没有流量的问题。 自己在网上找一堆教程&#xff0c;或者花高价去报课程。 有的朋友比较幸运&#xff0c;遇到了好的领路人&#xff0c;但是大部分朋友还是没有那么幸运的。 糖果…