LeetCode 3186 最大施法伤害

leetcode3186.施咒的最大总伤害 在选择一种咒语后,就不能使用伤害绝对值相差 1 或 2 的咒语。由于答案只与所选的咒语集合相关,而与顺序无关,我们可以按从小到大的顺序进行选择,并将相同伤害的法术看成同一种。已知魔法师使用伤害值为 power[i] 的咒语时,他们就 不能 使用伤害为。可以使用咒语 1,2,3,伤害值分别为 1,6,6,总伤害值为 13。可以使用咒语 0,1,3,伤害值分别为 1,1,4,总伤害值为 6。,其中每个元素表示一个咒语的伤害值,可能会有多个咒语有相同的伤害值。一个魔法师有许多不同的咒语。 阅读详情

题目信息

LeetoCode地址: . - 力扣(LeetCode)

题目理解

这道题很直观,玩游戏的都懂,伤害最大化嘛!

但是每个法术释放与否可能会影响总体的伤害,因此是从局部最优解找到全局最优解的动态规划问题!

禁止释法的区间是+-2,且相同伤害的法术可以释放多次,所以很容易想到,将伤害相同的法术进行计数,并按照伤害的大小进行排序。这样就可以从最小的伤害开始考虑释放与否了。

剩下的,直接看代码吧

动态规划写法

class Solution {
   public long maximumTotalDamage(int[] power) {
	Map<Integer, Integer> map = new HashMap<>();
	for (int p : power) {
	    map.put(p, map.getOrDefault(p, 0)+1);
    }
    //所有不重合的法术伤害及个数
    int[][] sorted = new int[map.size()][2];
    int i = 0;
    for (Map.Entry<Integer, Integer> entry : map.entrySet()){ 
        sorted[i][0] = entry.getKey();
        sorted[i][1] = entry.getValue();
        i++;
    }
    //对伤害进行排序
    Arrays.sort(sorted, (a,b) -> a[0]-b[0]);
    //记录从第一个法术开始到当前法术可能造成的最大伤害
    long[] dp = new long[sorted.length];
    // 第一个法术当然要释放,不然伤害就是0
    dp[0] = 1L * sorted[0][0] * sorted[0][1];
    for (i = 1;i < sorted.length; i++) {
        // 假如第i个法术不释放,则最大伤害就是上一个值
        dp[i] = dp[i-1];
        int j = i-1;
        // 如果决定释放第i个法术,则j代表了上一个最近可以释放的法术
        // 这里没有必要朝更早期遍历,因为dp[i]一定不小于dp[i-1]
        while (j>=0 && sorted[j][0]+2 >= sorted[i][0]) {
        j--;
        }
        //如果存在j,则将其伤害和当前法术的伤害相加,和上一个值比较
        if (j >=0) {
            dp[i] = Math.max(dp[i], sorted[i][0] * sorted[i][1]+dp[j]); 
        } else {
            //否则将只释放第i个法术的伤害和上一个值比较
            dp[i] = Math.max(sorted[i][0] * sorted[i][1], dp[i]);
        }
    }
    return dp[sorted.length-1];
   }
}
【C++动态规划 前缀和】3186. 施咒的最大总伤害|1840 一个魔法师有许多不同的咒语。 给你一个数组 power ,其中每个元素表示一个咒语的伤害值,可能会有多个咒语有相同的伤害值。 已知魔法师使用伤害值为 power[i] 的咒语时,他们就 不能 使用伤害为 power[i] - 2 ,power[i] - 1 ,power[i] + 1 或者 power[i] + 2 的咒语。 每个咒语最多只能被使用 一次 。 请你返回这个魔法师可以达到的伤害值之和的 最大值 。 阅读详情

相关推荐

自动化测试软件设计:C# + VISA 库实现多接口(GPIB/USB)测试仪器控制

本文介绍了如何利用C#和VISA库开发支持多接口的自动化测试软件。VISA库作为标准化API,能够统一控制GPIB、USB等不同接口的测试设备。文章详细阐述了软件设计目标,包括多接口支持、统一控制、自动化脚本执行等功能。重点讲解了C#中VISA库的安装配置,并提供了设备控制类的核心代码实现,涵盖设备连接、命令发送、响应读取等关键操作。通过具体示例展示了GPIB和USB设备的连接方式,并扩展了自动化测试脚本功能。该方案具有高扩展性和维护性,适用于电子设备测试、生产线检测等多种场景,为自动化测试系统开发提供了实

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1712

Leetcode3186. 施咒的最大总伤害

Leetcode3186. 施咒的最大总伤害

ProgramNovice的博客 596

逆向CarPlay协议时,除了USB主从切换,你还需要注意这3个关键点

本文深入探讨逆向CarPlay协议时的3个关键点,包括MFi协议背景、多通道协同工作机制和协议分析工具的高级过滤技巧。特别解析了USB主从切换后的复杂交互过程,帮助安全研究员和逆向工程师更好地理解CarPlay协议的核心机制与潜在安全研究切入点。

weixin_29164497的博客 382

3186.施咒的最大总伤害解析(LeetCode C++)

本题要求计算魔法师使用咒语的最大总伤害,其中使用伤害值为power[i]的咒语时,不能使用伤害值为power[i]±1或power[i]±2的咒语。以下将以示例为例,详细解析代码执行过程。

sweetikelike的博客 784

拆解一个带主动均衡的BMS模块:从变压器、MOS管矩阵到控制逻辑,图文详解内部设计与成本构成

本文深度拆解了一款带主动均衡功能的BMS模块,详细解析了其核心架构、元器件选型与成本构成。通过高频变压器、MOS管矩阵等硬件设计,该模块实现了高达87%的能量转移效率,远超普通被动均衡方案。文章还揭示了汽车级PCB设计、软件策略优化等关键技术细节,为锂电池管理系统设计提供了实用参考。

weixin_42638178的博客 348

深入解析线性反馈移位寄存器(LFSR)的工作原理与实现

本文深入解析了线性反馈移位寄存器(LFSR)的核心原理与实现方法。通过生动的比喻和详细的步骤拆解,阐述了LFSR如何通过反馈多项式和移位操作生成伪随机序列,并对比了斐波那契型与伽罗瓦型两种硬件结构。文章还涵盖了LFSR在数字电路测试、通信扰码及快速伪随机数生成等关键应用场景,同时指出了其在密码学中的局限性,并提供了Python和C语言的高效实现代码示例。

weixin_29007243的博客 545

leetcode 3186. 施咒的最大总伤害

动态规划的呢,只要一个数字可以使用,那么它的相同数字都可以使用,所以像 1 1 1 2 2 3 3 可以归类到 {1, 3}, {2, 2}, {3, 2},前者是数字,后者是统计数量。 # 解题过程 > 首先排序的,然后归类的,像数字 1 3,相差两个的,需要首先放入一个 0,1 0 3,这样就可以用位置来代替数字的大小,像数字 1 6,相差>2的,需要放入两个0,1 0 0 6,这样用位置来代替数字的大小。像 1 1 1 3 3 9 9 9 11 11,归类以后就是:{1, 3}, {3, 2},

邹九的个人博客 483

【学习体会】Lighttools8.4.0:简单光学系统实例

添加球型光源(SphereSource)和表面接收器: 对光线模拟的参数进行设置: 光线追踪-模拟输入 要追踪的光线总数,决定模拟的准确度,总数越多,准确度越高,当然耗时更多 预览光线数量是模拟之后可以看到的示意光线(黑线),一般是100~1000,随意设置 点击,开始模拟: (模拟结果) 如果光线太多,则会出现,可以看到剩余时间 照度分析: 分析-照度显示-光栅图表 ...

LeonJin的博客 1万+

LeetCode 3186. 施咒的最大总伤害【记忆化搜索;动态规划】【值域打家劫舍】

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。。

memcpy0的博客 1110

SigFit实战:从FEA到光学仿真的热力耦合分析全流程解析

在光机系统与芯片封装等精密工程领域,热与力的耦合效应是影响产品性能与可靠性的核心物理问题。有限元分析(FEA)是预测结构在热、力载荷下变形与应力的基础工具,但其结果通常无法直接用于评估光学性能。这需要一座桥梁,将物理场数据转化为光学设计语言。其核心原理在于数据映射与面形表征技术,例如通过泽尼克多项式拟合,将离散的节点位移分解为离焦、像散等标准光学像差。这项技术的工程价值在于,它实现了多物理场仿真的闭环,使工程师能在设计阶段精准预测热变形或应力对波前误差、调制传递函数等关键光学指标的影响。其典型应用场景包括高

weixin_28630185的博客 340

数据中台:大数据平台,数据仓库(DM),数据中台之间的联系以及异同分析

大数据平台是一个技术平台。这个技术平台提供了对于大数据的分布式采集,存储,流处理和计算,实时分析等能力。在没有大数据平台前也有数据集成和管理的平台,这种平台可以实现对结构化数据本身的采集,集成和管理。 管理平台,是在原生的大数据生态的基础之上,为了更好的管理集群服务,管理集群的资源,提供灵活SRE能力和资源核算审计能力的一系列工具和合称整体架构数据中台包括数据仓库的全部内容,数据仓库为数据中台提供了数据对外提供服务的基础资源,数据中台将数据仓库建设的投入价值进行最大化,以加快数据赋能业务的速度大家都知道数据

GIS摆渡人 2132

【记忆化搜索】【超详细】力扣3186. 施咒的最大总伤害

在实际递归的运算过程中,采用的是深度优先遍历,也就是计算{4,1}的res需要第二层的{3,1}和{1,2}都返回给它一个值,他会先看{3,1}有没有返回给它一个值,发现{3,1}没有返回给它一个值,他就会计算{3,1}的两个子节点的返回值来计算{3,1}的值是多少,他就会先看第三层{1,2}有没有返回给他一个值,发现也没有,就会去计算第三层{1,2}的两个子节点的返回值来计算{1,2}的值,由于第三层的{1,2}是第一个元素了,所以他的两个子节点都只能返回它0。这个标题,就能理解了。

sjsjs11的博客 1158

风险登记册vs问题日志:项目经理必须掌握的区别与应用

在项目管理的世界里,风险登记册和问题日志就像是项目经理的两个得力助手。我们的目的就是要搞清楚这两个助手各自的特点、区别以及如何在项目中好好使用它们。范围涵盖了项目从启动到结束的整个过程,无论是小项目还是大项目,都能从对这两个工具的正确使用中受益。我们先会用有趣的故事引出风险登记册和问题日志的概念,然后像给小学生讲故事一样解释它们是什么。接着分析它们之间的关系和区别,再用代码示例模拟它们在项目中的应用,之后介绍实际的应用场景、推荐相关工具和资源,探讨未来的发展趋势和挑战。

项目管理的博客 875

LeetCode 3186.施咒的最大总伤害:动态规划+双指针——O(1)空间(暂未发现其他O(1)空间的题解)

LeetCode 3186.施咒的最大总伤害:动态规划+双指针——O(1)空间(暂未发现其他O(1)空间的题解) 一个魔法师有许多不同的咒语。 给你一个数组 power ,其中每个元素表示一个咒语的伤害值,可能会有多个咒语有相同的伤害值。 已知魔法师使用伤害值为 power[i] 的咒语时,他们就 不能 使用伤害为 power[i] - 2 ,power[i] - 1 ,power[i] + 1 或者 power[i] + 2 的咒语。 每个咒语最多只能被使用 一次 。 请你返回这个魔法师可以达到的

<font color="Pink">Tisfy的博客</font> 849

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

F.动态规划-入门DP-打家劫舍:3186. 施咒的最大总伤害

F.动态规划-入门DP-打家劫舍:3186. 施咒的最大总伤害解析

要努力去发光,而不是被照亮~ 369

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

3186. 施咒的最大总伤害

3186. 施咒的最大总伤害

weixin_45256307的博客 256

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

力扣题解:3186,释咒的最大总伤害

可以使用咒语 1,2,3,伤害值分别为 1,6,6,总伤害值为 13。,其中每个元素表示一个咒语的伤害值,可能会有多个咒语有相同的伤害值。可以使用咒语 0,1,3,伤害值分别为 1,1,4,总伤害值为 6。请你返回这个魔法师可以达到的伤害值之和的。一个魔法师有许多不同的咒语。已知魔法师使用伤害值为。每个咒语最多只能被使用。

yyssas的博客 195

LeetCode 3186.施咒的最大总伤害

可以使用咒语 1,2,3,伤害值分别为 1,6,6,总伤害值为 13。,其中每个元素表示一个咒语的伤害值,可能会有多个咒语有相同的伤害值。可以使用咒语 0,1,3,伤害值分别为 1,1,4,总伤害值为 6。easy easy 注意开long long。请你返回这个魔法师可以达到的伤害值之和的。一个魔法师有许多不同的咒语。已知魔法师使用伤害值为。每个咒语最多只能被使用。

2302_79344985的博客 168

题解/算法 {3186. 施咒的最大总伤害}

1

qq_66485519的博客 341

2025-01-18:施咒的最大总伤害。用go语言,一个魔法师掌握了多种不同的咒语,每个咒语对应一个伤害值,这些伤害值存储在数组 power 中,其中可能会有多个咒语具有相同的伤害值。 使用某个特定伤

2025-01-18:施咒的最大总伤害。用go语言,一个魔法师掌握了多种不同的咒语,每个咒语对应一个伤害值,这些伤害值存储在数组power中,其中可能会有多个咒语具有相同的伤害值。使用某个特定伤害值为power[i]的咒语后,魔法师不能再使用伤害值为power[i]-2、power[i]-1、power[i]+1或power[i]+2的任何咒语。此外,每个咒语只能被施放一次。请你计算并返回魔法师能够实现的最大伤害值总和。输入:power=[7,1,6,6]。

福大大架构师每日一题 1万+

动态规划--Day04--打家劫舍--740. 删除并获得点数,3186. 施咒的最大总伤害,2140. 解决智力问题

动态规划–Day04–打家劫舍–740. 删除并获得点数,3186. 施咒的最大总伤害,2140. 解决智力问题 今天要训练的题目类型是:【打家劫舍】,题单来自@灵艾山茶府。 掌握动态规划(DP)是没有捷径的,咱们唯一能做的,就是投入时间猛猛刷题。 动态规划要至少刷100道才算入门! 记忆化搜索是新手村神器。方便理解,写完之后可以转译成递推。 但是有些题目只能写递推,才能优化时间复杂度。熟练之后直接写递推也可以。

m0_60740070的博客 1034

Leetcode 3186. Maximum Total Damage With Spell Casting

Leetcode 3186. Maximum Total Damage With Spell Casting

codename_cys的博客 366

力扣动态规划-6【算法学习day.100】

##我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!

2301_79232523的博客 326

Leetcode - 周赛402

leecode - 周赛402,主要知识点:dfs记忆化+递推,树状数组,线段树

m0_74859835的博客 890
上一篇: LeetCode 310 最小高度树
下一篇: Leetcode 3290. 最高乘法得分
耐利
博客等级 码龄12年 188粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值