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

【每日一题】3186. 施咒的最大总伤害

一.题目描述

3186. 施咒的最大总伤害

一个魔法师有许多不同的咒语。

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

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

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

请你返回这个魔法师可以达到的伤害值之和的 最大值 。

实例1:

输入:power = [1,1,3,4]

输出:6

解释:

可以使用咒语 0,1,3,伤害值分别为 1,1,4,总伤害值为 6 。

实例2:

输入:power = [7,1,6,6]

输出:13

解释:

可以使用咒语 1,2,3,伤害值分别为 1,6,6,总伤害值为 13 。

提示:

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

二. 解析

这是一个“值域打家劫舍”问题:在按伤害值排序后的唯一值上做动态规划,选择某个值时必须跳过与它差距小于 3 的值。

  1. 首选合并计数,统计每个伤害出现的次数,使用hash表进行统计。
  2. 然后,对伤害进行排序统计,便于后续对条件进行处理
  3. 进行动态规划

2.1 动态规划

  1. 状态表示:dp[i]:[0,i]区间内的子序列中,总数最大的值
  2. 状态转移方程
    以最后一个位置i讨论
    不选i,就是dp[i-1]
    选i,就要找到i的左边满足nums[i]-3>=nums[j]的值
    dp[j]+nums[i]*次数
  3. 初始化
    dp[0]=nums[0]*次数
  4. 填表顺序
    从左到右
  5. 返回值
    dp[n-1]

注意细节:j从-1开始表示没有合法前驱,所以选i时如果j<0,那么dp[j]就不存在。
在寻找第一个符合的位置时,判断条件是j+1<i && nums[j+1]<=nums[i]-3
而不是nums[j]<=nums[i]-3,因为下面的判断会让j出现在第一个不符合的位置上。

三.代码

class Solution 
{
public:long long maximumTotalDamage(vector<int>& power) {//1.hash统计计数unordered_map<int,long long> hash;for(auto x:power)hash[x]++;vector<int> nums;//2.对不同的伤害进行排序nums.reserve(hash.size());for(auto& [a,b]:hash)nums.push_back(a);sort(nums.begin(),nums.end());//3.动态规划int n=nums.size();vector<long long> dp(n);dp[0]=nums[0]*hash[nums[0]];int j=-1;for(int i=1;i<n;i++){//找到j的最大且合理的位置while(j+1<i && nums[j+1]<=nums[i]-3)j++;long long tmp=(j<0 ? 0 : dp[j])+nums[i]*hash[nums[i]];dp[i]=max(dp[i-1],tmp);}return dp[n-1];}
};
http://www.dtcms.com/a/474337.html

相关文章:

  • 如何做新网站php 资讯网站
  • 专门做推广的网站吗哪个网站可以改字体
  • 小迪安全v2023学习笔记(一百零三讲)—— 漏扫项目篇PoC开发Rule语法反链判断不回显检测Yaml生成
  • MySQL的练习题二----创建表的练习题
  • 设备技术支持东莞网站建设大连模板网站制作多少钱
  • Dockerfile 指令详解与实战指南
  • 10.1 快速排序(排序(下))
  • 前端梳理体系从常问问题去完善-框架篇(Vue2Vue3)
  • 【数据分享】青藏高原10米分辨率DEM数据集
  • 网站正在建设中空白模板网站建设调查通知
  • 【星闪】Hi2821 | 低功耗开发 + 低功耗管理及按键唤醒例程
  • 怎么做网站的网盘品牌网站建设公司有哪些
  • 【Linux】Socket编程基础
  • 长春建网站wordpress 图片打开慢
  • 91工业设计网模板网站有利于做seo吗
  • 做网站蓝色和什么颜色搭配好看万维网站注册
  • Windows 10 使用 VMware Workstation 搭建 Ubuntu 虚拟机
  • 深入解析Litho的多智能体协同架构与ReAct推理机制
  • 机器视觉---ViBe算法
  • Product Hunt 每日热榜 | 2025-10-12
  • C++11 多线程与并发编程
  • 太原网站建设优化有什么ae做动图的网站
  • 【全志V821_FoxPi】9-3 Linux IIC驱动SSD1306(0.96寸oled屏幕)
  • crm管理系统登录入口官网龙华网站优化
  • 基于S32DS配置S32K344的FlexCAN模块
  • typescript中的难点总结
  • PHP 字符串处理详解
  • 【JUC】线程池有哪些拒绝策略?该如何选择使用?
  • 4 随机数 从一个随机数到另外一个随机数、等概率随机
  • 机器学习17:如何有效使用自监督式学习