按摩师 | 打家劫舍 | 删除并获得点数 | 动态规划

1.按摩师(打家劫舍 I)

题目连接:面试题 17.16. 按摩师
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
注意:本题相对原题稍作改动

1.1.题目解析

在这里插入图片描述
按摩师可以任意选择预约接还是不接,说明不一定能是从第一个开始。在每次预约服务之间要有休息时间,只要是不相邻即可!那有两个问题,从那个地方开始接?服务完之后,一次跳过多少个预约?

1.2.解决问题

(1)、状态表示
假设以某个位置未结尾或者某个位置未起始 ,定义一个dp[i]就可以表示找到最优的预约集合。这里定义状态表示,以第i个位置为结尾,表示此时,dp[i]表示了预约时间最长!
但是这里有一个问题,第i个位置选还是不选的问题。假设nums = [1 2],如果i为2,这个位置选还是不选?这里的问题在于不能相邻,那要看第1个位置!所以划分两种情况:
g[i]表示,此时第i个位置必选,此时为最长预约时间
f [i]表示,此时第i个位置不选,此时为最长预约时间

(2)、状态转移⽅程
在这里插入图片描述
(3)、初始化
g[0] = nums[0],f[0] = 0
(4)、初始化顺序
这里根据题目要求,根据状态转移方程,从左往右,将两个dp填充。
(5)、返回值
返回max(f[i],g[i]),即为结果

1.3.参考代码

C++版本:

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

Java版本:

class Solution {public int massage(int[] nums) {int n = nums.length;if(n == 0) return 0;int g[] = new int[n];int f[] = new int[n];g[0] = nums[0];for(int i = 1;i < n;i++){g[i] = f[i -1] + nums[i];f[i] = Math.max(f[i -1],g[i -1]); }return Math.max(f[n-1],g[n-1]);}
}

2.打家劫舍 II

题目链接:213. 打家劫舍 II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

2.1.解决问题在这里插入图片描述

这个的问题和上一题唯一不同的点在于,第一个房子的处理。**情况一:**如果第一个房屋选,第一个房屋的值加上,从第三个房屋开始,到倒数第二个房屋的最大值。**情况二:**如果第一个房屋不选,那么从第二个房屋,到最后一个房屋,退化第一题的解决方案。

2.2.参考代码

C++版本:

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

Java版本:

class Solution {public int rob(int[] nums) {int n = nums.length;return Math.max(nums[0] + rob_(nums,2,n -1),rob_(nums,1,n));}public int rob_(int[] nums,int start,int end){if(end - start <= 0) return 0;int n = end - start;int f[] = new int[n];int g[] = new int[n];f[0] = nums[start];for(int i = 1;i < n;i++){f[i] = g[i -1] + nums[start + i];g[i] = Math.max(f[i -1],g[i - 1]);} return Math.max(f[n -1],g[n -1]);}
}

3.删除并获得点数

题目链接:740. 删除并获得点数
给你一个整数数组 nums ,你可以对它进行一些操作。
每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。
开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数

3.1.解决问题

能不能不删除?当然可以如果在多一步删除操作,岂不是多做无用功。另外,nums数组是无序的,也麻烦,不管三七二十一排序!可以将nums做预处理,映射到一个arr中。
在这里插入图片描述
最后映射成arr之后,就又变成的了。对arr数组的i位置的选还是不选,又变成了打家劫舍的问题。

3.2.参考代码

C++版本:

class Solution {
public:int deleteAndEarn(vector<int>& nums) {const int N = 10001;vector<int> arr(N);for(auto e : nums) arr[e] += e;vector<int> f(N);vector<int> g(N);for(int i = 1;i < N;i++){f[i] = g[i -1] + arr[i];g[i] = max(f[i- 1],g[i -1]);} return max(f[N -1],g[N -1]);}
};

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

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

相关文章

java基础filter servlet interceptor controller之间的关系

servlet Servlet是运行在Web服务器上的Java类。它们主要用于处理HTTP请求和响应。 Servlet可以接收来自客户端&#xff08;例如浏览器&#xff09;的HTTP请求并生成响应&#xff0c;这些响应通常是HTML页面、XML文档或其他格式的数据。Servlet通常被设计用来扮演Web应用的控制…

selenium 输入框、按钮,输入点击,获取元素属性等简单例子

元素操作 nput框 输入send_keys&#xff0c; input框 清除clear()&#xff0c; 按钮 点击click() 按钮 提交submit() 获取元素&#xff0c; tag_name、 class属性值、 坐标尺寸 """ input框 输入1次&#xff0c;再追加输入一次&#xff0c; 清除&#xff0c…

PyQt5学习系列之基础知识“字典”

PyQt5学习系列之基础知识——字典” 啰嗦字典使用字典取值与赋值其他使用 总结 啰嗦 在项目中使用到解析数据存放在字典中&#xff0c;对字典中的数据进行数据转化。即需要使用到字典&#xff0c;并对字典中的数据取值。 字典 一种可变容器模型存储任意类型对象每个键值对&am…

视频监控管理平台智能边缘分析一体机安防管理平台客流统计检测算法商场的场景应用方案

随着科技的不断发展&#xff0c;智能化技术已经广泛应用于各个领域。在商业领域&#xff0c;智能边缘分析一体机作为一种新兴的技术手段&#xff0c;为商场提供了一种高效、准确的客流统计方法。本文将探讨智能边缘分析一体机在商场客流统计中的应用方案。 商场作为人们日常生活…

【c语言】自定义类型-结构体

结构体 结构体的声明与使用结构体的声明与初始化结构体的自引用 结构体的内存对齐对齐规则为什么存在内存对齐修改默认对齐数 结构体的传参结构体实现位段什么是位段位段的内存分配位段的跨平台问题位段使用的注意事项 结构体&#xff1a;是一个自定义的类型&#xff0c;成员可…

利用CY3-COOH的羧基官能团标记蛋白质-星戈瑞

蛋白质作为生命体系中的关键分子&#xff0c;参与众多生物过程。因此&#xff0c;对蛋白质进行特异性标记和追踪是生物学研究中不可或缺的一环。CY3-COOH作为一种带有羧基官能团的荧光染料&#xff0c;具有强烈且稳定的荧光性质&#xff0c;被应用于蛋白质的标记和可视化。 标…

JavaScript严格模式

1. 严格模式 ECMAScript 5的严格模式是采用具有限制性 JavaScript 变体的一种方式&#xff0c;从而使代码隐式地脱离“马虎模式/稀松模式/懒散模式“&#xff08;sloppy&#xff09;模式。严格模式不仅仅是一个子集&#xff1a;它的产生是为了形成与正常代码不同的语义。不支持…

使用Docker辅助图像识别程序开发:在Docker中显示GUI、访问GPU、USB相机以及网络

目录概览 引言安装和配置安装docker安装nvidia-docker在docker中显示GUI在Docker中访问usb相机在Docker镜像中开放端口开启更多的GPU功能支持创建本地镜像中心一些可选参数上传镜像回收空间清理所有的无用镜像清理指定的镜像GPU Docker with Anaconda第一种方式:构建DockerFile…

【微信小程序】事件绑定和事件对象

文章目录 1.什么是事件绑定2.button组件3.事件绑定4.input组件 1.什么是事件绑定 小程序中绑定事件与在网页开发中绑定事件几乎一致&#xff0c;只不过在小程序不能通过on的方式绑定事件&#xff0c;也没有click等事件&#xff0c;小程序中 绑定事件使用bind方法&#xff0c;c…

【ArcGIS微课1000例】0116:将度-分-秒值转换为十进制度值(字段计算器VBA)

相关阅读:【ArcGIS微课1000例】0087:经纬度格式转换(度分秒转度、度转度分秒) 文章目录 一、计算方法二、计算案例一、计算方法 将度分秒转换为十进制度的简单等式: DD = (Seconds/3600) + (Minutes/60) + Degrees如果角度值是负数,则转换方法不同。其中一种方法是:

外贸实战|做外贸要主动,才会跟客户有订单!

很多人对我说过这种情况&#xff1a;客户给我发了一份询盘&#xff0c;但是我回复以后&#xff0c;客户就不理我了&#xff0c;好伤心。 我问&#xff1a;你跟了多久了&#xff1f; 很多人都会回答&#xff1a;几天或者不记得&#xff0c;他不理我&#xff0c;我也不知道怎么…

Spring Boot的@Async注解有哪些坑需要避免

一、什么是Async注解&#xff1f; Async注解是Spring框架提供的一种用于声明异步方法的工具。它可以将标注的方法从调用者的线程中分离出来&#xff0c;另起一个新线程执行&#xff0c;从而避免阻塞调用者的线程&#xff0c;提高系统的并发能力和响应速度。 基本使用方法如下&a…

Redis页面优化

文章目录 1.Redis页面缓存1.思路分析2.首先记录一下目前访问商品列表页的QPS1.线程组配置10000次请求2.请求配置3.开始压测1.压测第一次 平均QPS为6122.压测第二次 平均QPS为6153.压测第三次 平均QPS为617 3.然后记录一下访问商品详情页的QPS1.线程组配置10000次请求2.请求配置…

AIGC简介:如何利用人工智能进行内容生成

目录 一、引言二、AIGC的定义与技术原理1. 定义说明2. 关键技术3. 技术原理 三、AIGC的主要应用领域1. 文本内容生成2. 图像和视频生成3. 音频内容的创建4. 数据分析与报告 四、实施AIGC的步骤和方法1. 定义项目目标2. 数据准备与处理3. 选择合适的工具和技术4. 模型训练与测试…

uni-app学习--基础组件使用、页面生命周期、本地存储、网络请求、条件编译、路由跳转

文章目录 1. 基本组件的使用1. text文本组件的使用2. view视图容器组件的使用3. button按钮组件的使用4. image组件的使用5. map组件 2. uni-app中的样式1. uni-app&#xff1a;px2rpx计算 3. uni-app的数据绑定1. 基本的数据绑定2. v-bind,v-for,v-on 4. uni-app的生命周期1. …

服务器数据恢复—raid5阵列上分配的卷被删除后重建如何恢复被删除卷的数据?

服务器存储数据恢复环境&#xff1a; 某品牌FlexStorage P5730服务器存储&#xff0c;存储中有一组由24块硬盘组建的RAID5阵列&#xff0c;包括1块热备硬盘。 服务器存储故障&#xff1a; 存储中的2个卷被删除&#xff0c;删除之后重建了一个新卷。需要恢复之前删除的一个卷的数…

等保题目分享(60000字版)

文章目录 前言判断题单选题多选题简答题 前言 来源于网友会议 判断题 在对数据进行差异备份前&#xff0c;仍需进行数据库的全量备份。&#xff08;T) 某应用系统后台连续登录失败3次以后&#xff0c;需要输入验证码才能继续登录&#xff0c;这个应用系统实现了登录失败处理…

flink 状态

状态&#xff08;State&#xff09;是一个重要的概念&#xff0c;它允许Flink在处理流数据时跟踪和存储中间结果。这对于实现复杂的计算逻辑和满足应用需求至关重要。 Working with State 1. 状态类型 Flink支持两种主要类型的状态&#xff1a; 1.1 算子状态&#xff08;Op…

头文件和源文件的一些情况分析

c函数的定义和声明 函数和变量的声明可以有多次,但是定义只能有一次 其实头文件可以写函数的定义,但是在工程里面很多人引用这个头文件很容易造成重复定义的情况 有一个例外情况头文件里面也可以写函数定义或者变量定义 一般情况 //2.h #pragma once int add(int a, int b…

洛谷 P8721 [蓝桥杯 2020 省 AB3] 填空问题(缺少 inc.txt, E 题数据) 题解

题目分析 A 数青蛙 根据青蛙的个数分类计算&#xff1a; 青蛙数小于等于 2 2 2&#xff1a;此时青蛙数、眼睛数、嘴巴数和腿数读出来只读 1 1 1 个字&#xff0c;故此时一句话 14 14 14 个字。青蛙数大于 2 2 2&#xff0c;小于等于 5 5 5&#xff1a;此时青蛙数、眼睛…