[动态规划] 删除并获得点数

news/2024/9/17 7:09:08/ 标签: 动态规划, 算法

给你一个整数数组 nums ,你可以对它进行一些操作。

每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。

开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。

示例 1:

输入:nums = [3,4,2]
输出:6
解释:
删除 4 获得 4 个点数,因此 3 也被删除。
之后,删除 2 获得 2 个点数。总共获得 6 个点数。

示例 2:

输入:nums = [2,2,3,3,3,4]
输出:9
解释:
删除 3 获得 3 个点数,接着要删除两个 2 和 4 。
之后,再次删除 3 获得 3 个点数,再次删除 3 获得 3 个点数。
总共获得 9 个点数。

提示:

  • 1 <= nums.length <= 2 * 104
  • 1 <= nums[i] <= 104

解题分析

这道题设计的比较巧妙,可以利用动态规划的思路来解决问题。我们先理解一下题目的意思,然后尝试将它转换为一个经典的动态规划模型。我们知道,如果我们选择了nums[i],那么我们就不能选择nums[i]-1和nums[i]+1,而题目要求我们获得最大点数,所以我们也应当选择所有的与nums[i]相等的那些数,也就是说假如与nums[i]相等的数有x个,那么我们就可以得到x * nums[i]个点数。接下来就有意思了,不妨创建一个数组sum,这个sum数组的特点是sum[nums[i]] = nums[i] * x。其中x为个数。这样我们创建一个dp数组,dp[i]表示到第i个位置的时候,我们隔位选座(也就是说我们如果选了sum[c],那么我们就不能选它相邻位置的sum[c-1] 和 sum[c+1]) 能够得到的最大点数。显然,我们有递推关系式 dp[i] = max(dp[i-1],dp[i-2]+sum[i])。也就是说,如果我们选择第i个位置,那我们可以得到第i个位置的点数sum[i] 加上 我们到第i-2个位置时选座的最大点数。如果我们不选择第i个位置,那我们就可以考虑选第i-1个位置,而我们又确定了不选第i个位置,所以得到dp[i]就直接等于dp[i-1]即可。最后输出dp[n-1]即可。 

代码实现

class Solution {
private:int rob(vector<int> &nums){int n = nums.size();vector<long long> dp(n);dp[0]=nums[0];dp[1]=max(nums[0],nums[1]);for(int i=2;i<n;i++){dp[i]=max(dp[i-2]+nums[i],dp[i-1]);}return dp[n-1];}
public:int deleteAndEarn(vector<int>& nums) {int maxVal = 0;for(int val : nums){maxVal = max(maxVal,val);}vector<int> sum(maxVal+1);for(int val:nums){sum[val] += val;}return rob(sum);}
};


http://www.ppmy.cn/news/1522499.html

相关文章

vue3缺陷

Vue 3 的一些缺陷包括&#xff1a; 1. 兼容性问题&#xff1a;由于 Vue 3 使用了新的响应式系统&#xff0c;与 Vue 2 的代码不兼容。这意味着在迁移现有项目时需要进行一些改动。 2. 学习曲线&#xff1a;Vue 3 引入了一些新的概念和 API&#xff0c;相对于 Vue 2 有一定的学习…

如何利用AI优化知识中台的用户体验

引言 在数字化时代&#xff0c;知识中台作为企业知识管理与服务的重要载体&#xff0c;其用户体验的优劣直接关乎到信息的有效传递、员工的学习效率及企业的整体创新能力。随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;将AI融入知识中台的设计与优化中&a…

Linux系统高效进程控制的实战技巧

Linux系统高效进程控制的实战技巧 Linux是一种开源的Unix-like操作系统内核&#xff0c;由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于1991年首次发布。Linux以其稳定性、安全性和灵活性而著称&#xff0c;广泛应用于服务器、桌面、嵌入式系统等多个领域。在Linux系…

使用Docker快速安装和运行Elasticsearch

Elasticsearch 是一个基于 Lucene 构建的开源搜索引擎&#xff0c;它提供了分布式、多租户能力的全文搜索引擎&#xff0c;具有 HTTP web 接口和无模式的 JSON 文档。在本文中&#xff0c;我们将介绍如何使用 Docker 快速安装和运行 Elasticsearch。 为什么使用 Docker 安装 E…

redis中使用lua脚本

1、现实问题 1.redis采用单线程架构&#xff0c;可以保证单个命令的原子性&#xff0c;但是无法保证一组命令在高并发场景下的原子性。例如&#xff1a; 在串行场景下&#xff1a;A和B的值肯定都是3在并发场景下&#xff1a;A和B的值可能在0-6之间。 2.极限情况下1&#xff1…

Qt Widget核心属性

文章目录 前言enabledgeometrywindowTitlewindowIconwindowOpacitycursorfonttoolTipfocusPolicystyleSheet 前言 Qt中的各种控件&#xff0c;都是继承自QWidget类&#xff0c;了解这个类的属性方法之后&#xff0c;后续的控件也通用 enabled enabled描述了一个控件是否处于…

文件包含PHP伪协议利用方法

1.file://协议 使⽤&#xff1a; file:// ⽂件的绝对路径和⽂件名 2.php?cmdfile://D:\phpstudy_pro\WWW\123.txt 2.php://filter协议 ⽤途&#xff1a;常⽤于读取⽂件 / 源码 2.php?cmdphp://filter/readconvert.base64-encode/resource1.php 3.php://input协议 步骤一&…

【C++拓展(一)】后端开发常用的技术栈

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; C拓展 1. 前言2. 语言层面3. 设计模式层面4. 开…

「Qt Widget中文示例指南」如何实现一个系统托盘图标?(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 System Tray Icon&a…

基础学习之——Apache Spark

Apache Spark是一种开源的大数据处理框架&#xff0c;它提供了快速、通用和可扩展的大数据分析和处理功能。Spark可以在大规模数据集上进行高速计算&#xff0c;并且可以与多种数据源和工具进行集成。 Spark的基本概念包括&#xff1a; 弹性分布式数据集&#xff08;Resilient…

【LeetCode 121】买卖股票的最佳时机

1. 题目 2. 分析 如果当前的价格比之前买入的价格要低&#xff0c;那么我们就“逢低买入”&#xff0c;更新买入的价格&#xff0c;因为在此后的每一天里&#xff0c;当前的价格与之前的买入价格相比是更优解。 如果读者对单调队列有接触&#xff0c;可以看到这一步的核心思想…

iOS P8证书推送测试

最近在配合服务端人员调试相关的 APNS auth key 推送的问题&#xff0c;相比于苹果的P12证书的推送&#xff0c;P8证书的推送显得方便很多&#xff0c;P8的优势在于简单&#xff0c;安全 容易生成 最重要的是不会过期。 现在我们来看下测试具体流程&#xff1a; 方法一 地址…

掌握Hive函数[1]:从基础到高级应用

目录 函数简介 单行函数 算术运算函数 数值函数 字符串函数 日期函数 流程控制函数 集合函数 案例演示 函数简介 Hive将常用的逻辑封装成函数供用户使用&#xff0c;类似于Java中的函数。这样做的好处是可以避免用户反复编写相同的逻辑代码&#xff0c;可以直接调用这些函数。…

2024 RustChinaConf 赞助商介绍

2024 RustChinaConf 得到了行业各界的广泛支持&#xff0c;在此向以下赞助商表示感谢&#xff01; 非凸科技 非凸科技是一家全栈使用Rust的金融科技公司&#xff0c;致力于为券商、私募、公募等金融机构及个人投资者提供一站式数智交易领域服务解决方案。作为本次大会的钻石赞助…

jmeter之ForEach控制器使用

ForEach控制器作用&#xff1a; 一般和用户自定义变量或者正则表达式提取器配合使用&#xff0c;读取返回结果中一系列相关的变量值&#xff0c;该控制器下的取样器都会被执行一次或多次&#xff0c;每次读取不同的变量值(类似python当中的for语句,用来遍历操作) 本节代码已上…

币安/欧易合约对冲APP系统开发

币安合约对冲系统开发是一个复杂且专业的过程&#xff0c;它涉及到多个方面的技术和策略。以下是对币安合约对冲系统开发的一个概述&#xff1a; 一、系统概述 币安合约对冲系统是一种利用币安交易所提供的合约交易功能&#xff0c;通过同时建立多头和空头仓位来减少或消除市…

hutool 集合相关交集、差集

开发过程中会遇到集合之间的对比之类的需求&#xff0c;之前经常会自己写个工具类来实现&#xff0c;目前hutool可以帮助我们解决很多问题&#xff0c;接下来我们就来实践下。 相关jar包 <dependency><groupId>cn.hutool</groupId><artifactId>hutool…

Python办公自动化案例

文章目录 系列文章办公自动化案例案例1&#xff1a;批量重命名文件案例2&#xff1a;Excel数据自动筛选案例3&#xff1a;PDF文件合并案例4&#xff1a;批量发送电子邮件案例5&#xff1a;日程安排提醒案例6&#xff1a;CSV文件数据统计案例7&#xff1a;Word文档生成案例8&…

Day18_0.1基础学习MATLAB学习小技巧总结(18)——MATLAB绘图篇(1)

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍&#xff0c;为了在这个过程中加深印象&#xff0c;也为了能够有所足迹&#xff0c;我会把自己的学习总结发在专栏中&#xff0c;以便学习交流。 参考书目&#xff1a;《MATLAB基础教程 (第三版) (薛山)》 之前的章节都是…

前端vue项目服务器部署(docker)

前端vue项目服务器部署(docker) 步骤 1: 导入 Nginx Docker 镜像 1、上传 Nginx Docker 镜像 将你的nginx-alpine.tar包上传到服务器上。假设路径为 /var/v3-admin-vite/nginx-alpine.tar。 scp -r "C:\Users\86184\Desktop\v3-admin-vite" root110.40.179.182:/…