力扣每日一题 6/28 动态规划/数组

  • 博客主页:誓则盟约
  • 系列专栏:IT竞赛 专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍ 

2742.给墙壁刷油漆【困难

题目:

给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time ,分别表示给 n 堵不同的墙刷油漆需要的开销和时间。你有两名油漆匠:

  • 一位需要 付费 的油漆匠,刷第 i 堵墙需要花费 time[i] 单位的时间,开销为 cost[i] 单位的钱。
  • 一位 免费 的油漆匠,刷 任意 一堵墙的时间为 1 单位,开销为 0 。但是必须在付费油漆匠 工作 时,免费油漆匠才会工作。

请你返回刷完 n 堵墙最少开销为多少。

示例 1:

输入:cost = [1,2,3,2], time = [1,2,3,2]
输出:3
解释:下标为 0 和 1 的墙由付费油漆匠来刷,需要 3 单位时间。同时,免费油漆匠刷下标为 2 和 3 的墙,需要 2 单位时间,开销为 0 。总开销为 1 + 2 = 3 。

示例 2:

输入:cost = [2,3,4,2], time = [1,1,1,1]
输出:4
解释:下标为 0 和 3 的墙由付费油漆匠来刷,需要 2 单位时间。同时,免费油漆匠刷下标为 1 和 2 的墙,需要 2 单位时间,开销为 0 。总开销为 2 + 2 = 4 。

提示:

  • 1 <= cost.length <= 500
  • cost.length == time.length
  • 1 <= cost[i] <= 10**6
  • 1 <= time[i] <= 500

分析问题:

思路一:

        首先,我们需要理解问题的本质是在给定成本和时间的列表情况下,找到满足一定体积需求的最小花费。这个问题通过定义一个 dfs 函数来解决,函数中的参数 i 表示当前考虑的物品索引,j 表示剩余需要的体积

        接下来,分析 dfs 函数的逻辑。当 j <= 0 时,表示剩余需要的体积已经满足要求,不需要再选择物品,所以返回 0 。当 i < 0 且 j > 0 时,表示没有物品可选但仍有剩余体积需求,这是不合法的情况,所以返回正无穷大 inf 。对于其他情况,有两种选择:一是选择当前物品,此时需要花费 cost[i] ,剩余需要的体积变为 j - time[i] - 1 ,然后递归调用 dfs(i - 1, j - time[i] - 1) ;二是不选择当前物品,直接递归调用 dfs(i - 1, j) 。函数返回这两种选择中的最小值。

        然后,要注意到使用了 @cache 装饰器进行记忆化搜索。这是为了避免重复计算相同的子问题,提高算法的效率。

        最后,在 paintWalls 方法中,通过获取 cost 列表的长度 n ,然后调用 dfs(n - 1, n) 来计算最小的花费。

思路二:

        首先,定义两个匿名函数 min 和 max ,分别用于求两个数中的最小值和最大值。

        然后,获取 cost 列表的长度 n ,并初始化一个列表 f 。 f[0] 设为 0 , f[1] 到 f[n] 设为正无穷大 inf 。

        接下来,通过遍历 cost 和 time 列表的对应元素 c 和 t ,进行动态规划的计算

        对于每个 c 和 t ,从 n 到 1 逆序遍历 f 列表。对于每个 j ,更新 f[j] 的值。更新的方式是取当前的 f[j] 和 f[max(j - t - 1, 0)] + c 中的最小值。 max(j - t - 1, 0) 表示在考虑当前时间 t 的情况下,能够完成的工作量对应的索引。通过这种方式,我们在每个位置 j 上,都找到了使用前 j 个物品能够达到的最小花费。

        最后,函数返回 f[n] ,即使用所有物品能够达到的最小花费。

 

代码实现:

思路一代码实现:
class Solution:def paintWalls(self, cost: List[int], time: List[int]) -> int:@cache  # 记忆化搜索def dfs(i: int, j: int) -> int:  # j 表示剩余需要的体积if j <= 0:  # 没有约束,后面什么也不用选了return 0if i < 0:  # 此时 j>0,但没有物品可选,不合法return infreturn min(dfs(i - 1, j - time[i] - 1) + cost[i], dfs(i - 1, j))n = len(cost)return dfs(n - 1, n)


思路二代码实现:
class Solution:def paintWalls(self, cost: List[int], time: List[int]) -> int:# 定义一个匿名函数min,用于求两个数的最小值min = lambda a, b: b if b < a else a# 定义一个匿名函数max,用于求两个数的最大值max = lambda a, b: b if b > a else an = len(cost)# 初始化一个列表f,f[0]为0,f[1]到f[n]为正无穷大f = [0] + [float('inf')] * n# 遍历cost和time列表的对应元素for c, t in zip(cost, time):# 从n到1逆序遍历f列表for j in range(n, 0, -1):# 更新f[j]的值,取当前f[j]和f[max(j - t - 1, 0)] + c的最小值f[j] = min(f[j], f[max(j - t - 1, 0)] + c)# 返回f[n],即完成所有工作的最小花费return f[n]

 


总结:

 思路一代码详解:
  1. 定义了一个内部的 dfs 函数,该函数使用了记忆化搜索(通过 @cache 装饰器实现)。dfs 函数接受两个参数:i 表示当前考虑的物品索引,j 表示剩余需要的体积。
  2. 在 dfs 函数中,如果 j <= 0 ,表示剩余需要的体积已经满足要求,不需要再选择物品,返回 0 。
  3. 如果 i < 0 且 j > 0 ,表示没有物品可选但仍有剩余体积需求,这种情况是不合法的,返回 inf (表示正无穷大)。
  4. 对于其他情况,有两种选择:
    • 选择当前物品(索引为 i ),那么需要花费 cost[i] ,并且剩余需要的体积变为 j - time[i] - 1 ,然后递归调用 dfs(i - 1, j - time[i] - 1) 。
    • 不选择当前物品,直接递归调用 dfs(i - 1, j) 。
  5. 最后,函数返回这两种选择中的最小值。
  6. 在 paintWalls 方法中,首先获取 cost 列表的长度 n ,然后调用 dfs(n - 1, n) 来计算最小的花费。

        总的来说,这段代码的目的是通过递归的方式,在考虑每个物品的选择与否的情况下,计算出满足剩余体积需求的最小花费。记忆化搜索的使用可以避免重复计算,提高算法的效率


考点

  1. 动态规划:两段代码都运用了动态规划的思想来解决问题。通过定义合适的状态(如代码中的 f 数组)和状态转移方程(如更新 f[j] 的值),来逐步求解最优解。
  2. 函数定义与使用:代码中定义了匿名函数(如 min 和 max 函数)来简化比较和操作。
  3. 列表操作:涉及到列表的初始化、遍历(正序和逆序)以及元素的更新。
  4. 逻辑推理与问题分析:需要理解问题的要求,找出合适的解法,并将其转化为代码实现。

 

收获

  1. 深入理解动态规划的概念和应用:通过实际解决这个问题,更加熟悉如何根据问题的特点定义状态和状态转移方程,从而有效地运用动态规划来求解最优解。
  2. 提高函数使用和定义的能力:学会了使用匿名函数来简洁地表达一些常见的操作,增强了代码的可读性和简洁性。
  3. 增强对列表数据结构的操作能力:包括列表的初始化、遍历和元素的修改,能够更加熟练地运用列表来解决实际问题。
  4. 培养逻辑思维和问题分析能力:在理解问题的基础上,能够将其转化为有效的算法和代码实现,提高了解决复杂问题的能力。
  5. 学会从不同的角度思考问题:两段代码虽然都解决了同一个问题,但实现方式略有不同,通过对比学习,可以拓宽解题思路,提高解决问题的灵活性。

“祈愿万家灯火熨烫过脉络,刀山与火海多深刻,都陪你渡过。”——《不痛》 

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

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

相关文章

密码学及其应用 —— 非对称加密/公匙密码技术

1 RSA加密算法 RSA加密算法是一种基于公钥密码学的加密技术&#xff0c;由罗纳德里维斯特&#xff08;Ron Rivest&#xff09;、阿迪萨莫尔&#xff08;Adi Shamir&#xff09;和伦纳德阿德曼&#xff08;Leonard Adleman&#xff09;在1977年共同发明。RSA算法是第一个既能用于…

C++ sizeof的各种

C sizeof的各种 1. 含有虚函数的类对象的空间大小2. 虚拟继承的类对象的空间大小3. 普通变量所占空间大小4. 复合数据类型&#xff08;结构体和类&#xff09;5. 数组6. 类型别名7. 动态分配内存8. 指针9. 静态变量10. 联合体11. 结构体使用#program pack 1. 含有虚函数的类对象…

如何用 php 实现邮件发送功能

一、使用 PHPMailer 发送邮件 1、需要先安装 PHPMailer 库。你可以使用 Composer 来安装它&#xff1a; composer require phpmailer/phpmailer2、安装完成后&#xff0c;可以创建一个简单的 PHP 脚本来发送邮件。以下是一个示例脚本&#xff1a; <?php use PHPMailer\P…

RuoYi_Cloud本地搭建

1.进入若依官网获取git地址 &#xff08;1&#xff09;百度搜“若依官网进”入如下界面 &#xff08;2&#xff09;点击进入git&#xff0c;点克隆下载 &#xff08;3&#xff09;复制http地址 2.在git链接在idea本地打开 &#xff08;1&#xff09;返回桌面——右键&#xf…

金属波纹管

金属波纹管是一种外型规则的波浪样的管材&#xff0c;常用的金属波纹管有碳钢的&#xff0c;和不锈钢的&#xff0c;也有钢质衬塑的、铝质的等等。这种管材主要用于需要很小的弯曲半径非同心轴向传动&#xff0c;或者不规则转弯、伸缩&#xff0c;或者吸收管道的热变形等&#…

大数据面试题之HBase(1)

目录 介绍下HBase HBase优缺点 说下HBase原理 介绍下HBase架构 HBase读写数据流程 HBase的读写缓存 在删除HBase中的一个数据的时候&#xff0c;它什么时候真正的进行删除呢?当你进行删除操作&#xff0c;它是立马就把数据删除掉了吗? HBase中的二级索引 HBa…

数据结构历年考研真题对应知识点(数组和特殊矩阵)

目录 3.4数组和特殊矩阵 3.4.2数组的存储结构 【二维数组按行优先存储的下标对应关系(2021)】 3.4.3特殊矩阵的压缩存储 【对称矩阵压缩存储的下标对应关系(2018、2020)】 【上三角矩阵采用行优先存储的应用(2011)】 【三对角矩阵压缩存储的下标对应关系(2016)】 3.4.…

python中Mysql的模糊查询

1.方法一&#xff1a;使用pymysql库的方法 当在Python中使用MySQL进行模糊查询时&#xff0c;我们通常会使用pymysql或mysql-connector-python这样的库来连接MySQL数据库并执行查询。以下是一个使用pymysql进行模糊查询的详细示例&#xff0c;包括安装库、连接数据库、执行查询…

为什么有的手机卡没有语音功能呢?

大家好&#xff0c;今天这篇文章为大家介绍一下&#xff0c;无通话功能的手机卡&#xff0c; 在网上申请过手机卡的朋友应该都知道&#xff0c;现在有这么一种手机卡&#xff0c;虽然是运营商推出的正规号卡&#xff0c;但是却屏蔽了通话功能&#xff0c;你知道这是为什么吗&am…

自组装mid360便捷化bag包采集设备

一、问题一&#xff1a;电脑太重&#xff0c;换nuc 采集mid360数据的过程中&#xff0c;发现了头疼的问题&#xff0c;得一手拿着电脑&#xff0c;一手拿着mid360来采集&#xff0c;实在是累胳膊。因此&#xff0c;网购了一个intel nuc, 具体型号是12wshi5000华尔街峡谷nuc12i…

何时使用查询字符串参数和路径参数_2024-06-28

REST API 已成为构建和使用 Web 服务的标准。在设计 REST API 时&#xff0c;一个重要方面是决定如何构造 URL 和参数。向 API 传递参数的两种常见方法是通过查询字符串参数和路径参数。本文将解释这两种方法之间的区别、何时使用每种方法&#xff0c;并提供示例来说明它们的用…

二刷算法训练营Day45 | 动态规划(7/17)

目录 详细布置&#xff1a; 1. 139. 单词拆分 2. 多重背包理论基础 3. 背包总结 3.1 背包递推公式 3.2 遍历顺序 01背包 完全背包 详细布置&#xff1a; 1. 139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单…

昇思25天学习打卡营第6天|linchenfengxue

​​​​​​SSD目标检测 SSD&#xff0c;全称Single Shot MultiBox Detector&#xff0c;是Wei Liu在ECCV 2016上提出的一种目标检测算法。使用Nvidia Titan X在VOC 2007测试集上&#xff0c;SSD对于输入尺寸300x300的网络&#xff0c;达到74.3%mAP(mean Average Precision)以…

刷题Day37|416. 分割等和子集

416. 分割等和子集 题目&#xff1a;416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;0-1背包问题&#xff0c;重量和价值一样&#xff0c;每个元素只能使用一次&#xff0c;装满背包且最大价值为sum/2就是true 。dp[target] target返回true。 …

nginx架构基本数据结构配置模块请求详解

nginx源码的目录结构&#xff1a; . ├── auto 自动检测系统环境以及编译相关的脚本 │ ├── cc 关于编译器相关的编译选项的检测脚本 │ ├── lib nginx编译所需要的一些库的检测脚本 │ ├── os 与平台相关的一些系统参…

端口扫描攻击检测及防御方案

端口扫描数据一旦落入坏人之手&#xff0c;可能会成为更大规模恶意活动的一部分。因此&#xff0c;了解如何检测和防御端口扫描攻击至关重要。 端口扫描用于确定网络上的端口是否开放以接收来自其他设备的数据包&#xff0c;这有助于网络安全团队加强防御。但恶意行为者也可以…

ubuntu 18 虚拟机安装(5) postgres sql 数据库 简单 应用

ubuntu 18 虚拟机安装&#xff08;5&#xff09; postgres sql 数据库 简单 应用 参考 PostgreSQL的基本使用整理 https://blog.csdn.net/qq_45658339/article/details/124431612 sudo su - postgres psqlsudo -u postgres psqlsudo systemctl status postgresql sudo syste…

50-1 内网渗透 - 未引用的服务路径提权

一、未引用的服务路径介绍 未引用的服务路径(Unquoted Service Path)漏洞利用了Windows文件路径解析的特性。当服务启动时,如果其执行文件路径中包含空格并且未包含在引号中,就可能导致此漏洞的发生。 具体来说,如果完整路径中包含空格且未使用引号括起来,Windows将按顺…

zabbix-server的搭建

zabbix-server的搭建 部署 zabbix 服务端(192.168.99.180) rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm cd /etc/yum.repos.d sed -i s#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix# zabbix.r…

实验八 T_SQL编程

题目 以电子商务系统数据库ecommerce为例 1、在ecommerce数据库&#xff0c;针对会员表member首先创建一个“呼和浩特地区”会员的视图view_hohhot&#xff0c;然后通过该视图查询来自“呼和浩特”地区的会员信息&#xff0c;用批处理命令语句将问题进行分割&#xff0c;并分…