力扣10.26

3181. 执行操作可获得的最大总奖励 II

给你一个整数数组 rewardValues,长度为 n,代表奖励的值。

最初,你的总奖励 x 为 0,所有下标都是 未标记 的。你可以执行以下操作 任意次 :

  • 从区间 [0, n - 1] 中选择一个 未标记 的下标 i。
  • 如果 rewardValues[i] 大于 你当前的总奖励 x,则将 rewardValues[i]加到 x 上(即 x = x + rewardValues[i]),并 标记 下标 i

以整数形式返回执行最优操作能够获得的 最大 总奖励。

数据范围

  • 1 <= rewardValues.length <= 5 * 104
  • 1 <= rewardValues[i] <= 5 * 104

分析

参考灵神的题解
最初想法是定义 f [ i ] [ j ] f[i][j] f[i][j]能否从前i个数中获得总奖励为 j j j,若能则为true状态转移如下:

  • 考虑能否选第i个数,假设第 i i i个数为v
    • 不选v: d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j]=dp[i-1][j] dp[i][j]=dp[i1][j]
    • 选v: d p [ i ] [ j ] = d p [ i − 1 ] [ j − v ] dp[i][j]=dp[i-1][j-v] dp[i][j]=dp[i1][jv]
  • 因此 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] ∣ d p [ i − 1 ] [ j − v ] dp[i][j]=dp[i-1][j]\ | \ dp[i-1][j-v] dp[i][j]=dp[i1][j]  dp[i1][jv]

考虑到 d p [ i ] [ j ] dp[i][j] dp[i][j]都只使用前 i − 1 i-1 i1个的状态,因此可以使用滚动数组优化掉i这一维
但这样复杂度还是 O ( n 2 ) O(n^2) O(n2),因此还得优化,考虑使用bitset
将一维数组压缩成一个二进制数f,从低到高若第i位为 f [ i ] = 1 f[i]=1 f[i]=1则表示对应的 d p [ i ] dp[i] dp[i] t r u e true true
接下来考虑 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] ∣ d p [ i − 1 ] [ j − v ] dp[i][j]=dp[i-1][j]\ | \ dp[i-1][j-v] dp[i][j]=dp[i1][j]  dp[i1][jv]怎么使用位运算替换
考虑特例 v = 2 v=2 v=2,在执行上面的状态转移时

  • d p [ 0 ] O R d p [ 2 ] dp[0]ORdp[2] dp[0]ORdp[2]
  • d p [ 1 ] O R d p [ 3 ] dp[1]ORdp[3] dp[1]ORdp[3]

因此若转化为二进制数f,实际是将f的低 v v v位先左移 v v v位再 O R OR OR f f f
具体来说可以这样变,下式中 m a x n maxn maxn为二进制数f的位数

  • f ∣ = f < < ( m a x n ) − v ) > > ( m a x n − 2 ∗ v ) f\ |= \ f<<(maxn)-v)>>(maxn-2*v) f = f<<(maxn)v)>>(maxn2v)
    • 刚开始左移 m a x n − v maxn-v maxnv是为了将低v位左边的数全清零(将最低位的v位移到最高位)
    • 再右移回去,这样就保证了高位都为0,可以直接异或到f中
      这样就可以将复杂度再除以32(这是因为使用了bitset)

代码

class Solution {
public:const static int N = 1e5 + 5;int maxTotalReward(vector<int>& rewardValues) {sort(rewardValues.begin(), rewardValues.end());bitset<N> f{1};for(auto v : rewardValues) {int move = f.size() - v;f |= f << move >> (move - v);}for(int i = rewardValues.back() * 2 - 1; i >= 0; i -- ) {if(f.test(i)) {return i;}}return 0;}
};

bitset

  • 初始化:
    • bitset<N> b1:初始化长度N位bitset
    • bitset<N> b1(k):使用二进制整数k初始化长度N位bitset
    • bitset<N> b3(string):使用二进制字符串string初始化长度N为bitset
  • b.any():是否存在为1的二进制位
  • b.count():值为1的二进制位个数
  • b[pos]:获取pos处的值
  • b,test(pos):pos处值是否为1
  • b.set(pos):将pos处值设置为1
  • b.reset():全设置为0
  • b.set():全设置为1

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

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

相关文章

leetcode hot100(1)

1.160.相交链表 &#xff08;1&#xff09;暴力解法 循环遍历listA的所有节点&#xff0c;循环内遍历B所有节点&#xff0c;检查当前遍历到的的A、B中的节点是否一致。 如果一致&#xff0c;标记&#xff0c;跳出循环。 最后根据标记为返回结果。 时间复杂度O(len(A)*len(…

解决torch识别不到cuda的问题——AssertionError: Torch not compiled with CUDA enabled

问题表现 测试torch-gpu是否可用 运行如下代码&#xff1a; import torch print(f"Current device: {device}") print(torch.__version__) # 查看pytorch安装的版本号 print(torch.cuda.is_available()) # 查看cuda是否可用。True为可用&am…

Java学习Day53:铲除紫云山金丹原料厂厂长(手机快速登录、权限控制)

1.手机快速登录 手机快速登录功能&#xff0c;就是通过短信验证码的方式进行登录。这种方式相对于用户名密码登录方式&#xff0c;用户不需要记忆自己的密码&#xff0c;只需要通过输入手机号并获取验证码就可以完成登录&#xff0c;是目前比较流行的登录方式。 前端页面&…

Halcon 多相机统一坐标系(标定)

多相机统一坐标系是指将多个不同位置的相机的图像采集到同一个坐标系下进行处理和分析的方法。 在计算机视觉和机器视觉领域中&#xff0c;多相机统一坐标系被广泛应用于三维重建、立体视觉、目标跟踪等任务中。 以gen_binocular_rectification_map&#xff08;生成描述图像映…

Python条形图 | 指标(特征)重要性图的绘制

在数据科学和机器学习的工作流程中&#xff0c;特征选择是一个关键步骤。通过评估每个特征对模型预测能力的影响&#xff0c;我们可以选择最有意义的特征&#xff08;指标&#xff09;&#xff0c;从而提高模型的性能并减少过拟合。本文将介绍如何使用 Python 的 Seaborn 和 Ma…

Vue.js 组件开发教程:从基础到进阶

Vue.js 组件开发教程:从基础到进阶 引言 在现代前端开发中,Vue.js 作为一款流行的 JavaScript 框架,以其简单易用和灵活性赢得了开发者的青睐。Vue 组件是 Vue.js 的核心概念之一,理解组件的开发和使用对构建复杂的用户界面至关重要。本篇文章将详细介绍 Vue.js 组件的开…

spygalss cdc 检测的bug(二)

当allow_qualifier_merge设置为strict的时候&#xff0c;sg是要检查门的极性的。 如果qualifier和src经过与门汇聚&#xff0c;在同另一个src1信号或门汇聚&#xff0c;sg是报unsync的。 假设当qualifier为0时&#xff0c;0&&src||src1src1&#xff0c;src1无法被gat…

SSM学习day01 JS基础语法

一、JS基础语法 跟java有点像&#xff0c;但是不用注明数据类型 使用var去声明变量 特点1&#xff1a;var关键字声明变量&#xff0c;是为全局变量&#xff0c;作用域很大。在一个代码块中定义的变量&#xff0c;在其他代码块里也能使用 特点2&#xff1a;可以重复定义&#…

好用的idea插件之自动sql生成

功能 自动化代码生成&#xff1a; 通过解析数据库表结构和实体类定义&#xff0c;自动生成对应的Mapper接口、XML映射文件、Service、DAO和实体类等代码。支持快速生成增删查改&#xff08;CRUD&#xff09;代码&#xff0c;以及在表结构变化后重新生成代码而不覆盖自定义方法。…

#【2024年10月26日更新】植物大战僵尸杂交本V2.6更新内容与下载

更新内容 新增植物&#xff1a; 英雄植物&#xff1a;终极射手、向日葵公主、汉堡王&#xff08;仅限英雄模式使用&#xff09;。星卡植物&#xff1a;星星盒子、猫窝、迷幻投手、玉米旋转机&#xff08;需要一定数量的星星解锁&#xff09;。挑战植物&#xff1a;金卡黄金锤子…

什么是 VolTE 中的 Slient Redial?它和 CSFB 什么关系?

目录 1. 什么是 Silent Redial(安静的重拨号)? 2. Silent Redial 信令流程概述 3. 总结 Silent Redial 和 CSFB 啥关系? 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信),或者想要 cpp 方向修改简历,模拟面试,学习指导都…

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误 测试环境1、 MYODBC 3.51.18 or higher2、分析和解决2.1 解决1&#xff0c;降级MySQL ODBC2.2 解决2&#xff0c;修改FreeSWITCH代码 测试环境 http://myfs.f3322.net:8020/ 用户名&#xff1a;admin&#xff0c;密…

【学术论文投稿】Windows11开发指南:打造卓越应用的必备攻略

【IEEE出版南方科技大学】第十一届电气工程与自动化国际会议&#xff08;IFEEA 2024)_艾思科蓝_学术一站式服务平台 更多学术会议论文投稿请看&#xff1a;https://ais.cn/u/nuyAF3 目录 引言 一、Windows11开发环境搭建 二、Windows11关键新特性 三、Windows11设计指南 …

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21目录1. The Fair Language Model Paradox摘要研究背景问题与挑战如何解决创新点算法模型实验效果重要数据与结论推荐阅读指数&…

Spring Boot:植物健康监测的智能先锋

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了植物健康系统的开发全过程。通过分析植物健康系统管理的不足&#xff0c;创建了一个计算机管理植物健康系统的方案。文章介绍了植物健康系统的系统分析部分&…

基于Python的B站视频数据分析与可视化

基于Python的B站视频数据分析与可视化 爬取视频、UP主信息、视频评论 功能列表 关键词搜索指定帖子ID爬取指定UP主的主页爬取支持评论爬取生成评论词云图支持数据存在数据库支持可视化 部分效果演示 爬取的UP主信息 关键词搜索爬取 指定UP主的主页爬取 指定为黑马的了 爬取视…

嵌入式C语言字符串具体实现

大家好,今天主要给大家分享一下,如何使用C语言进行字符串操作与实现。 第一:字符串相关操作实现 复制函数五个基本要素: 头文件:#include <string.h> 函数原型:strcpy(char dest[],char src[]) -----string copy 功能:把src数组中\0之前的所有字符,连同‘\…

Http 状态码 301 Permanent Rediret 302 Temporary Redirect

HTTP状态码301和302是什么&#xff1f; 1、HTTP状态码301 HTTP状态码301表示永久性转移&#xff08;Permanent Redirect&#xff09;&#xff0c;这意味着请求的资源已经被分配了一个新的URI&#xff0c;以后的引用应该使用资源现在所指的URI。 HTTP 301状态码表示请求的资源…

工具方法 - Omnifocus: 网页版基本操作

1&#xff0c;第一个左上角点开&#xff0c;显示如下的视角&#xff1a; 从这个工具来说&#xff0c;优先的第一事项&#xff0c;是用户从哪个视角来切入&#xff0c;不同的视角展现不同的逻辑&#xff0c;对应不同的操作。 通过视角一级的菜单&#xff0c;来方便用户的操作。 …

2024.10.9华为留学生笔试题解

第一题无线基站名字相似度 动态规划 考虑用动态规划解决 char1=input().strip() char2=input().strip() n,m=len(char1),len(char2) dp=[[0]*(m+1) for _ in range(n+1)] #dp[i][j]定义为以i-1为结尾的char1 和以 j-1为结尾的char2 的最短编辑距离 setA = set(wirel@com) set…