LC-1335. 工作计划的最低难度(区间DP、记忆化搜索==>动态规划)

news2024/12/24 2:21:31

1335. 工作计划的最低难度

难度困难97

你需要制定一份 d 天的工作计划表。工作之间存在依赖,要想执行第 i 项工作,你必须完成全部 j 项工作( 0 <= j < i)。

你每天 至少 需要完成一项任务。工作计划的总难度是这 d 天每一天的难度之和,而一天的工作难度是当天应该完成工作的最大难度。

给你一个整数数组 jobDifficulty 和一个整数 d,分别代表工作难度和需要计划的天数。第 i 项工作的难度是 jobDifficulty[i]

返回整个工作计划的 最小难度 。如果无法制定工作计划,则返回 -1

示例 1:

img

输入:jobDifficulty = [6,5,4,3,2,1], d = 2
输出:7
解释:第一天,您可以完成前 5 项工作,总难度 = 6.
第二天,您可以完成最后一项工作,总难度 = 1.
计划表的难度 = 6 + 1 = 7 

示例 2:

输入:jobDifficulty = [9,9,9], d = 4
输出:-1
解释:就算你每天完成一项工作,仍然有一天是空闲的,你无法制定一份能够满足既定工作时间的计划表。

示例 3:

输入:jobDifficulty = [1,1,1], d = 3
输出:3
解释:工作计划为每天一项工作,总难度为 3 。

示例 4:

输入:jobDifficulty = [7,1,7,1,7,1], d = 3
输出:15

示例 5:

输入:jobDifficulty = [11,111,22,222,33,333,44,444], d = 6
输出:843

提示:

  • 1 <= jobDifficulty.length <= 300
  • 0 <= jobDifficulty[i] <= 1000
  • 1 <= d <= 10

(区间DP)记忆化搜索 ==> 动态规划

题解:https://leetcode.cn/problems/minimum-difficulty-of-a-job-schedule/solution/by-zhou-pen-cheng-ab2b/

题意:

给定d天,每天都要完成至少一份工作,且按照数组的顺序。

  • 如果工作数少于天数,那么最后一定有未安排工作的日子
  • 如果工作数等于天数,那么每天只能依次安排一个工作
  • 更一般的情况,可用动态规划来求解

状态定义:

f[i][j]表示考虑前i个工作,即job[0,...,i-1],时间为j天的答案。

最后返回的答案应该是f[n][d],其中n = len(job)

状态转移

f[i][j]可以将job[i-1]单独安排在第j天做,将前i-1个工作,安排在前j-1

更一般的可以将job[i-k,...,i-1]安排在第j天做,将前i-k个工作,安排在前j-1

  • f[i][j]=f[i−k][j−1]+max(job[i−1,...,i-k])

我们可以遍历所有合法k值,取这些方案答案的最小值。

  • 因为第j天必须要安排一份工作,所以最少也得安排job[i-1],即 k >= 1
  • 因为工作数不能少于工作天数,所以要求i - k >= j - 1k <= i - j + 1

所以状态转移方程为:

在这里插入图片描述

在进行状态转移时,j <= i 才能保证至少每天都有一份工作,当然j还不能超过题目设定的天数d

细节:

注意到状态转移方程中,有一项求最大值的操作,为了优化时间复杂度,可以将job区间最大值预先处理出来,如何求区间最大值就很简单了。g[i][j]表示job[i,...,j]的最大值。

class Solution:
    def minDifficulty(self, jobDifficulty: List[int], d: int) -> int:
        n = len(jobDifficulty)
        if d > n:
            return -1 # 就算你每天完成一项工作,仍然有一天是空闲的
        # 预处理出区间的最大值
        dp = [[0 for _ in range(n)] for _ in range(n)]
        for i in range(n):
            dp[i][i] = jobDifficulty[i]
            for j in range(i, n):
                if j == 0: continue
                dp[i][j] = max(dp[i][j-1], jobDifficulty[j])
        
        # f[i][j]可以将job[i-1]单独安排在第j天做,将前i-1个工作,安排在前j-1天
        # 更一般的可以将job[i-k,...,i-1]安排在第j天做,将前i-k个工作,安排在前j-1天
        @cache
        def dfs(i: int, j: int) -> int:
            if j == 1:
                return dp[0][i-1]
            ans = float('inf')
            for k in range(1, i-j+2):
                ans = min(ans, dfs(i-k, j-1) + dp[i-k][i-1])
            return ans
        return dfs(n, d)

记忆化搜索转递推

class Solution:
    def minDifficulty(self, jobDifficulty: List[int], d: int) -> int:
        n = len(jobDifficulty)
        if d > n:
            return -1 # 就算你每天完成一项工作,仍然有一天是空闲的
        # 预处理出区间的最大值
        dp = [[0 for _ in range(n)] for _ in range(n)]
        for i in range(n):
            dp[i][i] = jobDifficulty[i]
            for j in range(i, n):
                if j == 0: continue
                dp[i][j] = max(dp[i][j-1], jobDifficulty[j])
        
        # f[i][j]表示考虑前i个工作,即job[0,...,i-1],时间为j天的答案。
        f = [[float('inf') for _ in range(d+1)] for _ in range(n+1)]
        f[0][0] = 0
        for i in range(1, n+1):
            for j in range(1, min(i+1, d+1)):
                for k in range(1, i-j+2):
                    f[i][j] = min(f[i][j], f[i-k][j-1] + dp[i-k][i-1])
        return f[n][d]        

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

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

相关文章

JavaSE进阶(一)—— 面向对象进阶(static、单例、代码块、继承)

目录 一、static静态关键字 1. static是什么&#xff0c;static修饰成员变量的用法 2. 成员方法的分类 2.1 使用场景 3. static修饰成员方法的内存原理 4. static的注意事项[拓展] 二、static应用知识&#xff1a;工具类 1. 工具类是什么 2. 工具类的好处 3. 为什么工…

域名信息收集

被动信息收集 0x01 Certificate Transparency&#xff08;证书透明&#xff09; 证书透明度(Certificate Transparency)是证书授权机构的一个项目&#xff0c;证书授权机构会将每个SSL/TLS证书发布到公共日志中。一个SSL/TLS证书通常包含域名、子域名和邮件地址。查找某个域名…

Java进阶-字符串的使用

1.API 1.1API概述 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&#xff0c;我们不需要关心这些类是如何实现的&#xff0c;只需要…

PPT技能之描边字,要大要醒目别整没用的

文字仅仅加粗&#xff0c;还是不够明显&#xff0c;不妨用上描边字。不会Photoshop&#xff0c;不会PS&#xff0c;也可以做好看的描边字。 描边字&#xff0c;是在文字的边缘加上边框&#xff0c;让文字更醒目、突出。 你的关注&#xff0c;是我最大的动力&#xff01;你的转…

【K8s】基本存储、高级存储(PV和PVC)、配置存储

文章目录 背景一、基本存储1、EmptyDir2、HostPath3、NFS 二、高级存储1、认识PV和PVC2、PV3、PVC4、生命周期 三、配置存储1、ConfigMap2、 Secret 背景 程序运行在容器中&#xff0c;而容器的生命周期可能极其短暂&#xff0c;容器销毁&#xff0c;数据丢失&#xff0c;因此…

pip install出现socket.timeout: The read operation timed out的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

MySQL 8.0不再担心被垃圾SQL搞爆内存

MySQL 8.0.28引入的新功能 MySQL 8.0.28开始&#xff0c;新增一个特性&#xff0c;支持监控统计并限制各个连接&#xff08;会话&#xff09;的内存消耗&#xff0c;避免大量用户连接因为执行垃圾SQL消耗过多内存&#xff0c;造成可能被OOM kill的风险。 首先&#xff0c;需要…

【Servlet】图解HTTP请求Tomcat服务器实现前后端交互

文章目录 前言如何构造HTTP请求&#xff1f;1、通过form表单构造HTTP请求① form发送GET请求② form发送POST请求 2、通过Ajax构造HTTP请求同步等待与异步等待的感性理解 3、使用postman构造HTTP请求4、通过 Java socket 构造 HTTP 请求 如何实现前端给后端传参1、query string…

Jetpack Compose 中的debug调试

之前在 Jetpack Compose 中的重组作用域和性能优化 一文中主要介绍了如何从代码层面进行一些优化以及提到了一些值得注意的优化事项&#xff0c;本文主要来了解一下官方提供了哪些工具层面的手段可以帮助我们进行Compose的debug性能调试。 常规debug方式 这个跟以前的方式一样…

『python爬虫』22. 初识自动化测试工具selenium(保姆级图文)

目录 1. selenium的安装配置2. 为什么使用selenium&#xff1f;它的优势和缺点是什么&#xff1f;3. selenium的基本使用4. selenium实战之csdn搜索python博文4.1 点击选择文章4.2 搜索栏输入搜索关键词4.3 实现代码 总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 …

【MYSQL】索引的原理(B+树实现)和操作

目录 1.MYSQL与磁盘交互的基本单位 2.索引的原理 3.聚簇索引 4.索引操作 认识磁盘 1.MYSQL与磁盘交互的基本单位 为了提高基本的IO效率&#xff0c; MySQL进行IO的基本单位是16KB 一次使用16KB&#xff08;称为page&#xff09;为单位大于磁道的扇面&#xff08;521B&…

Golang笔记:使用ssh包作为客户端与SSH服务器交互

文章目录 目的基础说明使用演示单次通讯连续通讯&#xff08;远程终端&#xff09; 总结 目的 Golang中可以使用 golang.org/x/crypto/ssh 包作为SSH客户端或者SSH服务使用。这篇文章将简单记录下作为客户端使用的一些内容。 Package ssh implements an SSH client and server…

Java基础 开发相关的介绍和准备(开发环境搭建)

Java 概述 是 SUN(Stanford University Network&#xff0c;斯坦福大学网络公司 ) 1995 年推出的一门高级 编程语言。 是一种面向 Internet 的编程语言。Java 一开始富有吸引力是因为 Java 程序可以在 Web 浏览器中运行。这些 Java 程序被称为 Java 小程序(applet)&#xff0c…

学系统集成项目管理工程师(中项)系列22a_信息化知识(上)

1. 战略资源 1.1. 信息 1.2. 土地 1.3. 能源 1.4. 材料 2. 信息information 2.1. 客观事物状态和运动特征的一种普遍形式 2.2. 控制论 2.2.1. 维纳Norbert Wiener 2.2.2. 信息就是信息&#xff0c;既不是物质也不是能量 2.3. 哲学界 2.3.1. 信息是事物普遍联系的方式…

通过xshell连接甲骨文服务器并安装宝塔详细图文教程避免踩坑

问题&#xff1a; 一&#xff0c;甲骨文创建好了&#xff0c;并且下载了私钥&#xff0c;怎么连接&#xff1f;忘记下载了怎么办&#xff1f; 二&#xff0c;xshell怎么使用&#xff1f; 三&#xff0c;宝塔怎么安装&#xff1f; 起点&#xff1a; 最近有幸注册了一个甲骨…

SpringBoot--Lombok--Initailizr--yaml

目录 SpringBoot--Lombok Lombok 介绍 ● Lombok 作用 ● SpringBoot 和IDEA 官方支持 Lombok 常用注解 Lombok 应用实例 代码实现 在pom.xml 引入lombok 修改Furn.java 使用Lombok 注解简化代码, 解读 NoArgsConstructor AllArgsConstructor ToString Setter Ge…

多种方法解决Please specify which branch you want to merge with的错误

文章目录 1. 复现错误2. 分析错误3. 解决错误3.1 远程有分支3.2 远程无分支 4. 总结 1. 复现错误 今天发布某版本的项目&#xff0c;准备创建个v0point1分支&#xff0c;后期如果修改该版本&#xff0c;直接在该分支上修改即可。 首先&#xff0c;使用git branch v0point1命令…

软考A计划-真题-分类精讲汇总-第十三章(专业英语)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

红黑树的实现

文章目录 红黑树前言1. 红黑树的概念及性质1.1 红黑树的概念1.2 红黑树的性质 2. 红黑树的结构2.1 红黑树节点的定义2.2 红黑树的结构 3. 红黑树的操作3.1 红黑树的查找3.2 红黑树的插入处理红黑树颜色的过程(重点)情况1: 只变色情况2: 变色 单旋情况3: 变色 双旋 处理颜色的…

ubuntu深度学习使用TensorFlow卷积神经网络——图片数据集的制作以及制作好的数据集的使用

首先我事先准备好五分类的图片放在对应的文件夹&#xff0c;图片资源在我的gitee文件夹中链接如下&#xff1a;文件管理: 用于存各种数据https://gitee.com/xiaoxiaotai/file-management.git 里面有imgs目录和npy目录&#xff0c;imgs就是存放5分类的图片的目录&#xff0c;里面…