【动态规划】LeetCode-面试题 17.16. 按摩师

🎈算法那些事专栏说明:这是一个记录刷题日常的专栏,每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目,在这立下Flag🚩
🏠个人主页:Jammingpro
📕专栏链接:算法那些事
🎯每日学习一点点,技术累计看得见

题目

题目描述

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。

执行示例

示例 1:
输入: [1,2,3,1]
输出: 4
解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。

示例2:
输入: [2,7,9,3,1]
输出: 12
解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12。

示例3:
输入: [2,1,4,5,3,1,1,3]
输出: 12
解释: 选择 1 号预约、 3 号预约、 5 号预约和 8 号预约,总时长 = 2 + 4 + 3 + 3 = 12。

题解

由题意可知,按摩师无法接受相邻的预约,因而只有以下几种方式满足预约要求:①一次预约一次休息,预约与休息交替、②一次预约后,休息两次再预约。如下图所示↓↓↓
在这里插入图片描述
以上两种方式是预约最为紧凑的两种方式,那为什么没有预约一次后休息3次及以上呢?因为3次及以上休息中的可以将其中的部分休息时间改为预约,这样可以使得总的预约时长更大。而两次休息和一次休息中间没有任何一次休息可以改为预约。如下图所示↓↓↓
在这里插入图片描述
针对于上面两种预约方式,如果还不理解为什么一定要考虑"1预约后休息2次"的话,请看下面的例子:若有预约时长序列为[100,1,1,100,1,1,100]的情况,则我们按照预约1次休息1次的预约方式,则其得出的结果如下图所示↓↓↓
在这里插入图片描述
第一个表格显示的是预约时长序列,第二和第三个表示表示的是休息与预约交替的预约方式,它们均没有求出最长预约时长,而预约1次休息2次的方式可得到最长预约时长。因此,这两种预约方式我们都要考虑。

设预约时长序列为nums,我们创建一个dp表(一维数组)来存储到达第i个时长序列(下标为i的时长序列)时累计的最大预约时长。计算dp[i]时,说明第i个时间序列为预约状态,则我们不能将i-1设置为预约状态,但我们可以将i-2和i-3设置为预约状态(i-2设置为预约状态就是"休息-预约"交替进行的预约模式,i-3设置为预约状态就是"预约1次预约2次的休息方式")。我们可以得到dp[i]=max(dp[i-2], dp[i-3])+nums[i]。将i设置为预约状态和将i-1设置为预约状态,两者是互斥的。可能将上一步设置为预约状态会比将当前位置为预约状态的累计预约时长更大,因此,我们还需要执行dp[i]=max(dp[i],dp[i-1])
在这里插入图片描述
经过上面的分析,我们可以得到如下代码↓↓↓

class Solution {
public:int massage(vector<int>& nums) {int n = nums.size();vector<int>dp(n);if(n == 0) return 0;if(n == 1) return nums[0];if(n == 2) return max(nums[0], nums[1]);dp[0] = nums[0];dp[1] = nums[1];dp[2] = max(dp[1], dp[0] + nums[2]);for(int i = 3; i < n; i++){dp[i] = max(dp[i - 2], dp[i - 3]) + nums[i];dp[i] = max(dp[i], dp[i - 1]);}return dp[n - 1];}
};

除了这种思路外,我们还可以创建两个一维数组,分别命名为f和g,f数组存储当前位置为预约状态时累计的最长预约时长,g数组存储的时当前位置为休息状态时累计的最长预约时长。我们可以得到以下两个状态转移方程(递推公式):f[i]=g[i-1]+nums[i]()和g[i]=max(g[i-1],f[i-1])

ps:f[i]状态转移方程解释->已经知道上一个位置设置为休息状态时的最大累计预约时长,只要加上当前下标的时间序列即可。

ps:g[i]状态转移方程解释->当前为休息状态,上一个位置可以是休息也可以是预约,从两者中选择最大的,就能保证当前位置的累计预约时长最大。其实现代码如下↓↓↓

class Solution {
public:int massage(vector<int>& nums) {int n = nums.size();if(n == 0)return 0;vector<int>f(n);vector<int>g(n);f[0] = nums[0];for(int i = 1; i < n; i++){f[i] = g[i - 1] + nums[i];g[i] = max(f[i - 1], g[i - 1]);}return max(f[n - 1], g[n - 1]);}
};

本文存在不足,欢迎留言或私信批评、指正。希望我的解决方法能够对你有所帮助~~
今日打卡完成,点亮小星星☆→★

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

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

相关文章

网络攻击有什么危害,该如何防御

随着互联网的发展&#xff0c;网络安全成为大家关注的焦点。为了确保网络安全&#xff0c;我们需要采取一系列的防护措施。以下是几种常见的网络安全防护措施。 网络安全攻击的主要方式 垃圾邮件和钓鱼攻击&#xff1a;攻击者通过向用户发送大量的垃圾邮件或伪装成合法公司或…

软件工程单选多选补充

2. 4. 5. 6. 7. 8. 9. 10. 12。 13.

〖大前端 - 基础入门三大核心之JS篇㊻〗- JS + CSS实现动画

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

[Rust] 可迭代类型, 迭代器, 如何正确的创建自定义可迭代类型

在 Rust 中, for 语句的执行依赖于类型对于 IntoIterator 的实现, 如果某类型实现了这个 trait, 那么它就可以直接使用 for 进行循环. 直接实现 在 Rust 中, 如果一个类型实现了 Iterator, 那么它会被同时实现 IntoIterator, 具体逻辑是返回自身, 因为自身就是迭代器. 但是如…

MDETR 论文翻译及理解

题目Abstract1. Introduction2. Method2.1. Background2.2. MDETR2.2.1 Architecture2.2.2 Training 3. Experiments3.1. Pre-training Modulated Detection 预训练调制检测3.2. Downstream Tasks3.2.1 Few-shot transfer for long-tailed detection 4. Related work5. Conclus…

web前端之JavaScrip中的闭包

MENU 闭包--笔试-11defineReactive函数&#xff0c;利用闭包封装Object.defineProperty()闭包--节流函数--笔试-10闭包的定义JavaScript闭包的9大经典使用场景 闭包–笔试-11 function fun() { var n 9; // js 中强行给一个未声明的变量赋值&#xff0c;// 程序不会报错// 并…

程序员养生指南

1. 引言 程序员的工作环境通常是长时间坐在电脑前&#xff0c;面临着工作压力和紧张的项目期限。这种工作方式可能导致身体和心理健康问题。为了应对这些挑战&#xff0c;养生对程序员来说至关重要。 2. 坐姿与体态 正确的坐姿和体态对于减轻颈椎、腰椎和手腕的压力至关重要…

微机原理——定时器8253(8254)学习1

目录 定时类型 8253内部结构框图 8253命令字 六种工作方式及输出波形 计数初值的计算与装入 8253的初始化 定时类型 可编程定时器8253&#xff1a;&#xff08;内部采用的是16位 减法计数器&#xff09; 8253内部结构框图 8253命令字 8253有三个命令字&#xff1a;方式命…

HGNN+笔记

1.Title HGNN: General Hypergraph Neural Networks&#xff08;Yue Gao; Yifan Feng; Shuyi Ji; Rongrong Ji&#xff09;【IEEE Transactions on Pattern Analysis and Machine Intelligence 2023】 2.Conclusion This paper extend the original conference version HGNN,…

Linux打包压缩与搜索命令

tar 命令 tar [选项] [文件]选项: -c 产生.tar打包文件 -v 显示详细信息 -f 指定压缩后的文件名 -z 打包同时压缩 Gzip -x 解包.tar文件 示例1 压缩多个文件 tar -zcvf XXX.tar.gz n1.txt n2.txt示例2 压缩目录 tar -zcvf test.java.tar.gz test1示例3 解压&#…

大数据-hive

简介 hive是基于Hadoop的一个数据仓库工具&#xff0c;用来进行数据提取、转化、加载&#xff0c;这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表&#xff0c;并提供SQL查询功能&#xff0c;能将SQL…

C语言练习题

C语言练习题 文章目录 C语言练习题题目一题目二题目三题目四题目五题目六题目八 题目一 #include <stdio.h> //VS2022,默认对齐数为8字节 union Un {short s[7];int n; };int main() {printf("%zd", sizeof(union Un));return 0; }代码运行结果:> 16 sizeo…

新手村之SQL——增删改查条件查询

1.查询不同行——DISTINCT SELECT DISTINCT column_name FROM table_nameDISTINCT 关键字需位于列名之前。 2.在指定列中插入数据——INSERT INSERT INTO courses (name, student_count, created_at, teacher_id) VALUES (Flash Sale, 100, 2018-01-01, 5);3.更新数据——UPD…

用Python来解一元二次方程

1 问题 如何利用python 来解一元二次方程组。 2 方法 解一元二次方程是高中数学中的重要内容&#xff0c;也是数学中的基础知识之一。在Python语言中&#xff0c;我们可以使用数学库中的函数来解一元二次方程。一元二次方程的一般形式为&#xff1a;axbxc0&#xff0c;其中a、b…

基于Springboot + vue的汽车资讯网站

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

基于springboot实现的垃圾分类管理系统

一、系统架构 前端&#xff1a;html | layer | jquery | css 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、 代码及数据库 三、功能介绍 01. 登录页 02. 系统设置-用户管理 03. 系统设置-页面管理 04. 系统设置-角色管…

【Openstack Train安装】一、虚拟机创建

Openstack是一个云平台管理的项目&#xff0c;它不是一个软件。这个项目由几个主要的组件组合起来完成一些具体的工作。Openstack是一个旨在为公共及私有云的建设与管理提供软件的开源项目。它的社区拥有超过130家企业及1350位开发者&#xff0c;这些机构与个人将 Openstack作为…

[Java] 模拟Jdk 以及 CGLib 代理原理

文章目录 JDKarthas 反编译jdk代理对象arthas 反编译的结果是&#xff1a; CGlibmethodProxy 不经过反射调用方法的原理MethodProxy原理模拟 结合目标对象使用模拟结合 代理对象使用 JDK Jdk代理的最简单模拟&#xff0c; 由前文可知 JDK动态代理需要实现接口&#xff0c;所以…

★543. 二叉树的直径

543. 二叉树的直径 简单题&#xff0c;确实不难。 相当于就是求节点的深度。左孩子的最大深度 右孩子的最大深度 1 根节点深度。 本题要求的就是路径数&#xff0c;这里的路径数 节点数 - 1&#xff0c;然后想一下&#xff0c;对于一个节点来说&#xff0c;以他为根左右两…

数据结构与算法设计分析——NP完全理论

目录 一、P类问题与NP类问题的定义二、常见的NP类问题&#xff08;一&#xff09;旅行商问题&#xff08;TSP&#xff09;&#xff08;二&#xff09;哈密尔顿回路问题&#xff08;三&#xff09;判断回路问题&#xff08;四&#xff09;图的着色问题&#xff08;五&#xff09…