力扣每日一题 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 0
            if i < 0:  # 此时 j>0,但没有物品可选,不合法
                return inf
            return 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 a
        n = 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. 学会从不同的角度思考问题:两段代码虽然都解决了同一个问题,但实现方式略有不同,通过对比学习,可以拓宽解题思路,提高解决问题的灵活性。

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

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

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

相关文章

锂电池的串并联特性

1节锂电池电芯的规格是10000mah&#xff0c;4v&#xff08;总能量10000*4&#xff09; 那么3节电芯串联电池的规格是10000mah&#xff0c;12v&#xff08;总能量10000*12&#xff09;注意&#xff0c;这里电池的规格不是30000mah 3节电芯并联的规格是30000mah&#xff0c;4v …

容器:string

以下是对于string容器常用功能和函数的总结 主要包括 1、定义string 2、字符串赋值 3、字符串拼接&#xff1a;str.append() 4、字符串查找&#xff1a;str.find() / str.rfind() 5、字符串替换&#xff1a;str.replace(&#xff09; 6、字符串长度比较&#xff1a;str.compare…

创新实训(十三) 项目开发——实现用户终止对话功能

思路分析&#xff1a; 如何实现用户终止AI正在进行的回答&#xff1f; 分析实现思路如下&#xff1a; 首先是在用户点击发送后&#xff0c;切换终止对话&#xff0c;点击后大模型终止对话&#xff0c;停止sse&#xff0c;不再接收后端的消息。同时因为对话记录存入数据库是后…

Python武器库开发-武器库篇之Thinkphp5 SQL注入漏洞(六十六)

Python武器库开发-武器库篇之Thinkphp5 SQL注入漏洞&#xff08;六十六&#xff09; 漏洞环境搭建 这里我们使用Kali虚拟机安装docker并搭建vulhub靶场来进行ThinkPHP漏洞环境的安装&#xff0c;我们进入 ThinkPHP漏洞环境&#xff0c;可以 cd ThinkPHP&#xff0c;然后通过 …

Linux系统上部署Whisper。

Whisper是一个开源的自动语音识别&#xff08;ASR&#xff09;模型&#xff0c;最初由OpenAI发布。要在本地Linux系统上部署Whisper&#xff0c;你可以按照以下步骤进行&#xff1a; 1. 创建虚拟环境 为了避免依赖冲突&#xff0c;建议在虚拟环境中进行部署。创建并激活一个新…

Charles抓包工具系列文章(五)-- DNS spoofing (DNS域名伪装)

一、背景 DNS域名是依赖DNS域名服务器&#xff0c;特别是内部域名&#xff0c;最后寻址到后端服务地址。 当我们无法修改客户端的域名&#xff0c;而想让其指向到我们期望地址时&#xff0c;可以采用charles的DNS spoofing。 何谓DNS 欺骗&#xff1a;将自己的主机名指定给远…

React Native 开发常见问题及注意事项

本文只是使用时积累的一些经验 开发环境 1、Android Studio 依赖项下载慢 如果发现依赖下载非常慢&#xff0c;动不动十几KB的 参考&#xff1a;加速 Android Studio 依赖项下载 也可以切换数据源 修改 android/build.gradle中的jcenter()和google() repositories {// goo…

[图解]SysML和EA建模住宅安全系统-02-现有运营领域-块定义图

1 00:00:00,840 --> 00:00:02,440 首先我们来看画在哪里 2 00:00:02,570 --> 00:00:08,310 你看&#xff0c;这是图的类型&#xff0c;图里面内容 3 00:00:08,320 --> 00:00:10,780 这是元素类型 4 00:00:10,790 --> 00:00:14,900 这是位置&#xff0c;哪个包 …

鸿蒙开发 之 健康App案例

1.项目介绍 该项目是记录用户日常饮食情况&#xff0c;以及针对不同食物摄入营养不同会有对应的营养摄入情况和日常运动消耗情况&#xff0c;用户可以自己添加食品以及对应的热量。 1.1登陆页 1.2饮食统计页 1.3 食物列表页 2.登陆页 2.1自定义弹框 import preferences from oh…

当用户需求不详细时,如何有效应对

在项目沟通时&#xff0c;用户对需求说明不详细&#xff0c;可能是由于多种原因。以下是一些可能的原因及如何应对这些问题的建议&#xff1a; 1. 用户不完全理解自己的需求 原因&#xff1a; 用户对技术细节不了解&#xff0c;不知道如何具体描述需求。 用户对项目的全局和…

支持WebDav的网盘infiniCloud(静读天下,Zotero 等挂载)

前言 WebDav是一种基于HTTP的协议&#xff0c;允许用户在Web上直接编辑和管理文件&#xff0c;如复制、移动、删除等。 尽管有一些网盘支持WebDav&#xff0c;但其中大部分都有较多的使用限制。这些限制可能包括&#xff1a;上传文件的大小限制、存储空间的限制、下载速度的限…

met和set的特性及区别

1、关联式容器 在c初阶阶段&#xff0c;我们已经接触了STL的部分容器&#xff0c;比如&#xff1a;vector,list,deque&#xff0c;forward_list等。 这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的就是数据本身。 而关联式容器…

Qt的入门

Qt的入门 1.Qt的配置2.介绍Qt的使用2.1 Qt 5.14.22.2 Linguist 5.14.22.3Designer 5.14.22.4 Assistant 5.14.22.5 Qt Creator 4.11.1 3.创建第一个项目3.1点击文件来新建一个新的文件或项目3.2选择项目路径和名称3.3选择构建工具3.4类信息3.5翻译文件3.6选择编译器3.7项目管理…

Redis 内存碎片是什么?如何清理?

Redis 内存碎片相关的问题在得物、美团、阿里、字节、携程等公司的后端面试中都曾出现过&#xff0c;还是建议认真准备一下。即使不是准备面试&#xff0c;日常开发也是能够用到的&#xff01; 什么是内存碎片? 你可以将内存碎片简单地理解为那些不可用的空闲内存。 举个例子&…

Python文件匹配技巧详解

概要 在日常的文件操作和数据处理中,文件匹配是一个非常常见的任务。Python 提供了丰富的库和工具来实现文件匹配,这些工具不仅功能强大,还易于使用。本文将详细介绍如何使用 Python 实现文件匹配,包括基本的文件操作、通配符匹配、正则表达式匹配以及实际应用场景,帮助更…

NewspaceGPT带你玩系列之美人鱼图表(思维导图)

目录 注册一个账号&#xff0c;用qq邮箱&#xff0c;然后登录选一个可用的Plus&#xff0c;不要选3.5探索GPT今天的主角是开始寻梦美人鱼图表我选第四个试一下问答 自定义问题&#xff1a;问答叙述文六要素&#xff1a;示例&#xff1a; 结论关注我&#xff0c;不迷路&#xff…

服务器安装JDK,Maven等常用环境

生产环境部署服务器需要安装一些常用工具&#xff0c;下面我就把常用的jdk&#xff0c;maven&#xff0c;node&#xff0c;git的安装方法和步骤演示 一、安装JDK环境 执行如下命令&#xff0c;安装JDK,所有命令都是 复制&#xff0c;粘贴&#xff0c;回车 yum install -y jav…

vue uniapp MEQX JWT认证

1.下载依赖 npm install mqttimport * as mqtt from "mqtt/dist/mqtt.min" ​ 我是用的uniapp vue3 vite这里尝试了很多方式,都导入不进去后来我就采用的本地引入方式, 把mqtt.min.js下载到本地然后在index.html 中导入<script src"./MEQX/mqtt.js" typ…

同三维T908转换器 SDI转DVI/HDMI/VGA/色差分量/AV转换器

同三维T908转换器 SDI转DVI/HDMI/VGA/色差分量/AV转换器 1路SDI进&#xff0c;1路DVI(可转HDMI/VGA/色差分量/AV)3.5音频1路SDI出,可以支持音频解嵌&#xff0c;也可把3.5音频加嵌转换输出&#xff0c;输出分辨率可调&#xff0c;支持图像翻转180度 一、产品简介 SDI转万能转…

新能源行业必会基础知识-----电力市场概论笔记-----经济学基础

新能源行业知识体系-------主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/139946830 目录 1. 什么是市场2. 电力市场机制设计的基本要求 1. 什么是市场 经济学定义 市场是供需双方交易并决定商品价格和产量的机制市场可…