施咒的最大总伤害

news/2025/3/3 20:32:29/文章来源:https://www.cnblogs.com/PeachyGalaxy/p/18749230

题目大意

给你一个数组 power ,其中每个元素表示一个咒语的伤害值,可能会有多个咒语有相同的伤害值。

已知魔法师使用伤害值为 power[i] 的咒语时,他们就 不能 使用伤害为 power[i] - 2 ,power[i] - 1 ,power[i] + 1 或者 power[i] + 2 的咒语。

每个咒语最多只能被使用 一次 。

返回可以达到的伤害值之和的 最大值

数据范围

  • 1 <= power.length <= 105
  • 1 <= power[i] <= 109

思路

打家劫舍 相似

  • 选择咒语与出现次序无关,只与值有关;并且一个咒语有多个可能值,是每个咒语最多只用一次,而 不是每个值的咒语最多只能用一次 , 所以可能将所有值进行统计,还有它们的出现次数,这样 值*出现次数=伤害值; 再将统计出来的进行排序, 因为选择值为x的就不能选x-1和x-2

  • 从后往前推(dfs),最后一个是i

    • 选i ,那么i - 1 和 i - 2 都不能选,只能另外选择最大的小于i - 2的数
      • 难点在于如果像之前一样开个 vector f(ma + 1)的数组,或者使用a, b, c, d依次更新,由于数据过大,会导致爆内存
      • 就要使用哈希表,以及用while循环来寻找 最大的小于i-2的数,并且在power中出现了
    • 不选i,那么就选i前面的一个数即可。这里的前面的一个数,并不是\(i-1\),而是在power中的数排序之后,排在i前面的一个数
  • 从前往后推(递推),当前是i

    • 选i,再选择<i - 2最大的数,也是用while循环

    • 不选i,直接选择i的前一个数

    • 比较这两种情况谁更大

代码

爆内存的普通做法

class Solution {
public:using ll = long long;long long maximumTotalDamage(vector<int>& power) {int ma = ranges::max(power);int n = power.size(), cnt = 0;vector<int> a(ma + 1);for(auto& u : power) {if(a[u] == 0) cnt++;a[u] += u;}vector<ll> f(ma + 1);if(cnt == 1) return a[ma];f[1] = a[1], f[2] = max(a[1], a[2]);for(int i = 3; i <= ma; i++) {f[i] = max(f[i - 1], f[i - 2]);f[i] = max(f[i], f[i - 3] + a[i]);}return f[ma];}
};

递归版改进做法

class Solution {
public:using ll = long long;long long maximumTotalDamage(vector<int>& power) {unordered_map<ll, ll> mp;for(auto& u : power) mp[u]++;vector<pair<ll, ll>> a(mp.begin(), mp.end());ranges::sort(a);ll n = a.size();vector<ll> memo(n, -1);auto dfs = [&](auto&& dfs, ll x) -> ll {if(x < 0) return 0;ll& res = memo[x];if(res != -1) return res;ll j = x;auto& [u, v] = a[x];while(j && a[j - 1].first >= a[x].first - 2) j--;return res = max(dfs(dfs, x - 1), dfs(dfs, j - 1) + (ll)u * v);};return dfs(dfs, n - 1);}
};

递推版改进做法

class Solution {
public:using ll = long long;long long maximumTotalDamage(vector<int>& power) {unordered_map<ll, ll> mp;for(auto& u : power) mp[u] ++;vector<pair<ll, ll>> a(mp.begin(), mp.end());ranges::sort(a); //[出现的数, 出现次数]ll n = a.size();vector<ll> f(n); //第几小的值的出现次数f[0] = (ll)a[0].first * a[0].second; //最小的值*出现次数for(int i = 1, j = 0; i < n; i++) {auto& [u, v] = a[i];while(u - a[j].first > 2) j++; //直到u - a[j].first <= 2  !!!那么u - a[j - 1].first肯定会 < 2  !符合if(j == 0) f[i] = max(f[i - 1], (ll)u * v);  //j不能减少了else f[i] = max(f[i - 1], f[j - 1] + (ll)u * v);}return f[n - 1];}
};

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

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

相关文章

修理牛棚

思路: 有的牛棚住牛,有的是空的,从反过来的思路来想,先用一块木板盖住所有有猪住的猪棚,减去空牛棚数,最终得到最多被木板挡住门的牛棚的数量。 代码展示: #include<bits/stdc++.h> using namespace std; const int N=210; int m,s,c;int a[N],b[N];int main() {c…

写了个 CasaOS/ZimaOS 内网穿透的远程访问插件(不是 frp 或者 nps),欢迎大家测试使用

插件正在提交,应该过几天就会进入市场了。 插件访问效果大概如下: casaOS 远程界面 如果大家想先行测试可以手动下载 pr 的文件进行测试。使用 插件会提供一个二维码,使用OpenIoThub 开源 APP扫码添加插件网关,然后在客户端上添加要访问的主机,然后在主机下面添加端口,然…

20241904 2024-2025-2 《网络攻防实践》第一周作业

​ 一、知识点梳理与总结 1、 实验介绍 1) VM操作系统的三种网络连接方式的适用情况 (1)桥接(Bridged)模式 桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一…

从cURL到GraphQL:不同API类型概述

从cURL到GraphQL:不同API类型概述 API(应用程序编程接口)是现代软件开发的支柱,能够使不同的应用程序进行通信、共享数据并无缝执行任务。了解各种API类型及其实际应用可以为开发人员提供宝贵的见解。本文将探讨不同的API类型、它们的重要性,并通过实际示例说明它们的应用…

【H2O】--【HybrIK】关于RGB2SMPL算法工程HybrIK的安装记录

1. 前言 主要记录关于RGB2SMPL算法工程HybrIK的安装记录。 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。 如有不对之处,欢迎评论区指出错误,你我共同进步学习! 2. 正文 2.0 torch_tricks model.train()的作用是启用 Batch Normalization 和 Dropout。 m…

粤港澳大湾区-工业软件中心-诚聘CAE测试专家、高性能计算专家、系统工程师、CAE软件架构师、嵌入式软件开发工程师、数据库软件测试工程师等(广州 不限制年龄)

简介 粤港澳大湾区国家技术创新中心工业软件产业发展中心,是粤港澳大湾区国家技术创新中心直属创新平台之一。该中心致力于聚焦工业软件基础创新,构建工业软件全过程创新生态链,为推动我国工业软件产业发展做出重要贡献。 主要目标攻克核心技术: 突破工业软件核心关键技术,…

09 深度神经网络框架的基础:自动微分

当神经网络的层数增加,结构变复杂后,如果只用纯python(再加Numpy)来实现,代码将变得异常复杂,且难以阅读和调试。此时,就需要引入一些著名的深度学习框架了,比如PyTorch, TensorFlow等。 运用这些框架,你往往只需要定义一个神经网络的架构,反向传播过程则是自动完成的…

WebSocket调试工具深度对比:Postman与Apipost功能实测解析

WebSocket调试工具深度对比:Postman与Apipost功能实测解析 作为长期从事实时通讯系统开发的工程师,WebSocket协议在开发中是非常常见的。作为一种常见的 Web 协议,其与 Restful API 有着本质的不同。Restful API是基于请求-响应模式的单向通信,而 WebSocket 提供全双工通信…

leetcode hot 18

解题思路:这题思路就是用某个数据结构记录需要被置0的行和列,一般需要两次遍历。我采用集合的形式,最省空间的方法就是用数组的第一行和第一列来记录,但是要遍历一遍是是否第一行或第一列有0。 class Solution {public void setZeroes(int[][] matrix) {Set<Integer> …

中国版Workday从上千家大型跨国企业的实践总结:员工体验很重要

20世纪90年代中期,从Oracle、SAP等国外ERP巨头进入中国,并拿下华为、联想等一流企业,至今也依然保持着中国市场的优势地位。即便到了“国外企业应用软件在中国逐步式微”的今天,SAP约10000亿元的市值,也远超用友的约1000亿元市值。其中很大一个原因在于,中国企业的聪明—…

易路iBuilder—国内首个HR智能体管理平台,高效管理企业数字劳动力

易路iBuilder智能体平台不仅是工具集合,更是企业数字化转型的 “智能中枢”。它通过知识驱动、流程重构、人机共融,帮助企业将AI Agent从“执行者”升级为“战略伙伴”,最终实现 “人类定义价值,机器放大价值”的新工作范式。随着大模型技术的商业应用日益成熟,AI数字员工…