当前位置: 首页 > news >正文

3040. 相同分数的最大操作数目 II Medium

给你一个整数数组 nums ,如果 nums 至少 包含 2 个元素,你可以执行以下操作中的 任意 一个:

选择 nums 中最前面两个元素并且删除它们。

 ·选择 nums 中最后两个元素并且删除它们。

 ·选择 nums 中第一个和最后一个元素并且删除它们。

一次操作的 分数 是被删除元素的和。

在确保 所有操作分数相同 的前提下,请你求出 最多 能进行多少次操作。

请你返回按照上述要求 最多 可以进行的操作次数。

示例 1:

输入:nums = [3,2,1,2,3,4]
输出:3
解释:我们执行以下操作:
- 删除前两个元素,分数为 3 + 2 = 5 ,nums = [1,2,3,4] 。
- 删除第一个元素和最后一个元素,分数为 1 + 4 = 5 ,nums = [2,3] 。
- 删除第一个元素和最后一个元素,分数为 2 + 3 = 5 ,nums = [] 。
由于 nums 为空,我们无法继续进行任何操作。

示例 2:

输入:nums = [3,2,6,1,4]
输出:2
解释:我们执行以下操作:
- 删除前两个元素,分数为 3 + 2 = 5 ,nums = [6,1,4] 。
- 删除最后两个元素,分数为 1 + 4 = 5 ,nums = [6] 。
至多进行 2 次操作。

提示:

 ·2 <= nums.length <= 2000

 ·1 <= nums[i] <= 1000

题目大意:在规定可执行三种操作且每次操作结果相同的情况下计算最多可操作的次数。

分析:

(1)假设当操作的结果只能为k时,设dp[i][j]为数组arr[i:j]最多可执行结果为k的操作的次数。则当arr[i]+arr[i+1]=k时,dp[i][j]=max(dp[i][j],dp[i+2][j]+1);当arr[j]+arr[j-1]==k时,dp[i][j]=max(dp[i][j],dp[i][j-2]+1);当arr[i]+arr[j]=k时,dp[i][j]=max(dp[i][j],dp[i+1][j-1]+1);

(2)由(1)可知,可枚举k=nums[0]+nums[1]、k=nums[N-1]+nums[N-2]、k=nums[0]+nums[N-1]三种情况,并计算每种情况下dp[i][j-1]的值,最终结果即为dp[i][j-1]在三种情况下的最大值;

(3)由dp数组的定义可知,dp[i][j]=dp[j][i],因此可将二维数组dp压缩成长度为(1+N)*N/2的一维数组dp,节省一半的存储空间,其中二维数组下标i、j在一维数组中的下标为(1+j)*j/2+i。

class Solution {
public:vector<int> dp;int tar;bool finish;int dfs(int i,int j,vector<int>& nums){if(finish) return 0;if(i>=j){finish=true;return 0;}int id=(1+j)*j/2+i,ans=0;if(dp[id]>=0) return dp[id];if(nums[i]+nums[i+1]==tar) ans=max(ans,dfs(i+2,j,nums)+1);if(nums[j]+nums[j-1]==tar) ans=max(ans,dfs(i,j-2,nums)+1);if(nums[i]+nums[j]==tar) ans=max(ans,dfs(i+1,j-1,nums)+1);dp[id]=ans;return ans;}int maxOperations(vector<int>& nums) {int N=nums.size(),L=(1+N)*N/2;dp=vector<int>(L,-1);tar=nums[0]+nums[1];finish=false;int ans1=dfs(2,N-1,nums);dp=vector<int>(L,-1);tar=nums[0]+nums[N-1];finish=false;int ans2=dfs(1,N-2,nums);dp=vector<int>(L,-1);tar=nums[N-2]+nums[N-1];finish=false;int ans3=dfs(0,N-3,nums);return max({ans1,ans2,ans3})+1;}
};

相关文章:

  • 构建LangChain应用程序的示例代码:14、使用LangChain、GPT和Activeloop的Deep Lake来处理代码库
  • 稍微学学react
  • 56.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(4)
  • 43.bug:mapper接口参数使用@param重命名导致的错误
  • 怎么换自己手机的ip地址
  • C语言---深入指针(4)
  • springboot+minio+kkfileview实现文件的在线预览
  • 09 platfrom 设备驱动
  • 【Linux】信号(二)
  • 光伏电站绘制软件的基本方法
  • html标签
  • Swift 序列(Sequence)排序面面俱到 - 从过去到现在(三)
  • 【全部更新完毕】2024全国大学生数据统计与分析竞赛B题思路代码文章教学数学建模-电信银行卡诈骗的数据分析
  • K8s Pod的QoS类
  • 拼接sql字符串工具类
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 07.Android之多媒体问题
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • CSS 提示工具(Tooltip)
  • Docker: 容器互访的三种方式
  • Java 最常见的 200+ 面试题:面试必备
  • JSONP原理
  • mysql 数据库四种事务隔离级别
  • spark本地环境的搭建到运行第一个spark程序
  • Vue实战(四)登录/注册页的实现
  • 从重复到重用
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 突破自己的技术思维
  • 用Visual Studio开发以太坊智能合约
  • 最简单的无缝轮播
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • # linux从入门到精通(三)
  • # Redis 入门到精通(九)-- 主从复制(1)
  • #WEB前端(HTML属性)
  • $NOIp2018$劝退记
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (007)XHTML文档之标题——h1~h6
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (javascript)再说document.body.scrollTop的使用问题
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (补充)IDEA项目结构
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (九)信息融合方式简介
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (四)图像的%2线性拉伸
  • (一)Dubbo快速入门、介绍、使用
  • (原)本想说脏话,奈何已放下
  • (轉)JSON.stringify 语法实例讲解
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET 指南:抽象化实现的基类
  • .NET 中的轻量级线程安全