【LeetCode每日一题:1799. N 次操作后的最大分数和~~~记忆化搜索+动态规划+状态压缩+最大公约数】

输入n个数,最坏情况下用 n + logn - 2 次比较找出当中的最大值和次大值(3种做法) 这个题我一开始是递归 从底层出发 比到顶层 显然时间复杂度不允许后来想了一种n时间复杂度的开两个数用来维护最大值和最小值就可以了,什么意思呢比如 1 3 6 2 8 4 0 0 8是我们要求的数组int last = Integer.Min_Value;int cur = Integer.Min_Value;分别代表了上一个最大值和当前最大值我们走到a[0] cur = 1到a[1] cur=3 ... 阅读详情

题目描述

给你 nums ,它是一个大小为 2 * n 的正整数数组。你必须对这个数组执行 n 次操作。

在第 i 次操作时(操作编号从 1 开始),你需要:

选择两个元素 x 和 y 。
获得分数 i * gcd(x, y) 。
将 x 和 y 从 nums 中删除。
请你返回 n 次操作后你能获得的分数和最大为多少。

函数 gcd(x, y) 是 x 和 y 的最大公约数。

示例 1:

输入:nums = [1,2]
输出:1
解释:最优操作是:
(1 * gcd(1, 2)) = 1
示例 2:

输入:nums = [3,4,6,8]
输出:11
解释:最优操作是:
(1 * gcd(3, 6)) + (2 * gcd(4, 8)) = 3 + 8 = 11
示例 3:

输入:nums = [1,2,3,4,5,6]
输出:14
解释:最优操作是:
(1 * gcd(1, 5)) + (2 * gcd(2, 4)) + (3 * gcd(3, 6)) = 1 + 4 + 9 = 14

提示:

1 <= n <= 7
nums.length == 2 * n
1 <= nums[i] <= 106

求解思路

  1. 这道题目是一道动态规划类型求解的题目,我们通过记忆化搜索+状态压缩来求解。
  2. 最大公约数求解的模板代码就不多说了。
  3. 核心思路:通过遍历模拟俩个位置的值,通过状态压缩的技巧来判断当前这俩个位置的元素是否被选中,如果没有,好的,更新当前位置的状态为1,否则跳过继续,最大值的更新过程需要我们根据题目的要求模拟即可。循环结束,将最大的值记录到缓存表中。

实现代码

class Solution {
    Map<Integer, Integer> map;

    public int maxScore(int[] nums) {
        map = new HashMap<>();
        return dfs(0, nums, 1);
    }

    public int dfs(int state, int[] nums, int index) {
        if (map.containsKey(state)) {
            return map.get(state);
        }
        int result = 0;
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < nums.length; j++) {
                if (i == j) continue;
                if ((state & (1 << i)) == 0 && (state & (1 << j)) == 0) {
                    int nowState = state;
                    nowState |= (1 << i);
                    nowState |= (1 << j);
                    result = Math.max(index * gcd(nums[i], nums[j]) + dfs(nowState, nums, index + 1), result);
                }
            }
        }
        map.put(state, result);
        return result;
    }

    public static int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);
    }

}

运行结果

在这里插入图片描述

NX二次开发编译时dll自动数字签名及拷贝 在UG5.0开始,所有基于UG二次开发的DLL都要“签名”后才能被客户端上正版的NX调用。 阅读详情

相关推荐

保姆级教程:在Windows上用Python+OpenCV调用海康工业相机(附MVS配置避坑指南)

本文提供了一份详细的Windows环境下使用Python和OpenCV调用海康工业相机的保姆级教程,涵盖MVS配置避坑、相机连接、图像获取与格式转换等关键步骤。特别针对工业相机取流中的常见问题,如独占访问控制和多相机协同工作,提供了实用解决方案,帮助开发者快速实现稳定的图像采集系统。

weixin_29228781的博客 398

leetcode1799 --- 状态压缩与动态规划

原题我们看这里本题主要考察状态压缩和动态规划的部分知识,但是在此基础之上,我们先需要搞懂如何求最大公约数,如何求最大公约数的方法我之前有写到,可以看之前的文章,链接如下()

Lyajpunov的博客 533

scRNA-seq | 吐血整理的单细胞入门教程(从原理到代码实操)(二)

scRNA-seq | 吐血整理的单细胞入门教程(从原理到代码实操)(二)

m0_72224305的博客 4305

每日一练 总分数最大

每位同学都有自己的一个幸运数,乐乐所在班级共有n位同学,因此有编号为1至n的n块标牌,标牌的编号与自己的幸运数相乘,就是这位同学的分数。你的工作就是帮乐乐寻找一种方案,使得班级总分数最大。

Zdethm的博客 317

Zipformer实战:5分钟快速搭建语音识别模型(附LibriSpeech测试结果)

本文提供了一份详细的Zipformer语音识别模型实战指南。通过清晰的步骤,指导读者在5分钟内完成从环境配置、LibriSpeech数据集准备到模型训练与测试的全过程。文章重点解析了关键配置参数,并分享了在LibriSpeech测试集上的性能结果,帮助开发者快速评估和应用这一高效的语音识别架构。

weixin_35578748的博客 161

90nm CMOS工艺下6μW超低功耗LDO设计实战:从原理图到版图全解析

本文详细解析了在90nm CMOS工艺下设计一款静态功耗仅为6μW的超低功耗LDO(低压差线性稳压器)的全过程。文章深入探讨了如何通过改进型翻转电压跟随器(FVF)架构实现无输出电容设计,在满足极低功耗和芯片面积高效(chip-area-efficient)要求的同时,确保环路稳定性与快速瞬态响应,为物联网、可穿戴设备等应用提供关键电源管理解决方案。

weixin_29196613的博客 274

力扣(LeetCode)1799. N 次操作后的最大分数和(C++)

【墨染】图解状态压缩dp分析。

墨染 340

共享单车数据抓取与分析:使用Python爬虫抓取共享单车使用数据与地图信息

通过本篇博客,我们展示了如何使用Python爬虫抓取共享单车的使用数据和地图信息,并通过简单的数据分析得出有价值的见解。在实际应用中,数据的收集与分析不仅能帮助城市管理者更好地规划单车站点,还能为用户提供更精准的单车使用体验。未来,我们可以将此分析与机器学习模型相结合,进一步预测单车的使用趋势,优化调度算法,实现更加智能的共享单车管理。

2201_76125261的博客 2204

LeetCode-1799- N 次操作后的最大分数和

来表示状态为s时,能够去到的最大分数。由于题目限定了n的范围,因此我们可以利用二进制数字s来压缩状态,我们利用长度为m的二进制数s的每一位来表示该位上的数字是否被删除,若为1则表示没被删除。其中为了方便计算任意两个数之间的最大公约数,我们可以使用二维数组。我们可以使用动态规划来解决问题,我们利用数组。来记录任意两个数之间的最大公约数。

L.Wzz的博客 602

107.在 Vue 3 中使用 OpenLayers 实现视图联动功能

是一个非常强大的 Web 地图渲染库,支持多种地图数据格式和交互操作。在 Vue 3 中,我们可以利用。绑定到真实的 DOM 元素上,我们就可以用它们来初始化 OpenLayers 地图。来封装和管理 OpenLayers 地图的状态,从而更高效地开发地图应用。,即两个地图窗口共享同一个视图(View),从而实现同步缩放、拖动等操作。这可以确保 Vue 组件销毁时,OpenLayers 也正确销毁地图实例。,并且它们会同步缩放和拖动,达到地图联动的效果。这样,无论你拖动哪个地图,另一个都会同步变化。

小彭的博客 1938

面试问题总结——关于YOLO系列(三)

接着上篇的的YOLO系列面试问题总结,加油,冲! 三.YOLOv3 1.YOLOv3主干网络BackBone——Darknet-53网络结构(因为有53个卷积层) (原论文中Darknet53的尺寸是在图片分类训练集上训练的,所以输入的图像尺寸是256x256,而在YOLOv3中输入尺寸是416×416)   ①上图中,Top-1 Accuracy和Top-5 Accuracy是指什么呢?区别在哪呢?   我们知道ImageNet有大概1000个分类,而模型预测某张图片时,会给出1000个按概率从高.

boss-dog 1万+

STM32实验室消防预警系统:火焰烟雾温度三合一报警联动设计

嵌入式系统开发中,传感器数据采集与联动控制是工程落地的核心能力。从环境感知到逻辑判决,再到执行机构响应,一套完整的预警系统需要融合模拟量采集、数字协议解析和状态机设计。基于STM32主控,通过火焰传感器、烟雾传感器(MQ-2)和温度传感器(DS18B20)的多维检测,结合声光报警、排烟和继电器切断等联动机制,可实现高效的火情预警。此类设计不仅适用于实验室、机房等场景,也是理解裸机驱动开发和系统状态迁移的典型实践。本文将剖析一套开源消防预警系统,从硬件选型、Proteus仿真到代码实现,展示如何将传感器数据转

weixin_30357231的博客 458

基于Pycatia的智能孔特征识别技术:无参模型圆心自动化提取方案

基于Pycatia的智能孔特征识别技术:无参模型圆心自动化提取方案

KE17RS的博客 2875

【每日一题】1799. N 次操作后的最大分数和

LeetCode 1799. N 次操作后的最大分数和,每日一题系列

芊芊晚的博客 171

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

最大公约数 [动态规划]

最大公约数最大公约数最大公约数 正解部分\color{red}{正解部分}正解部分 最优情况中, gcdgcdgcd 每次变化都是 质因数分解中的一个质因子次数减少 111, 所以 fmax(n)f_{max}(n)fmax​(n) 为 [1,n][1, n][1,n] 中 质因数分解质数次幂的和 的 最大值 加上 111. 首先 fmax(n)f_{max}(n)fmax​(n) 分解质因数...

Zbr162的博客 439

温度PID控制PLC程序

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

LeetCode 1799. N 次操作后的最大分数和(回溯 / 状态压缩DP)

文章目录1. 题目2. 解题2.1 错误解2.2 回溯超时解2.3 回溯通过 1. 题目 给你 nums ,它是一个大小为 2 * n 的正整数数组。 你必须对这个数组执行 n 次操作。 在第 i 次操作时(操作编号从 1 开始),你需要: 选择两个元素 x 和 y 。 获得分数 i * gcd(x, y) 。 将 x 和 y 从 nums 中删除。 请你返回 n 次操作后你能获得的分数和最大为多少。 函数 gcd(x, y) 是 x 和 y 的最大公约数。 示例 1: 输入:nums = [1,2]

Michael是个半路程序员 975

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

[状压dp]leetcode1799:N 次操作后的最大分数和(hard)

题目: 题解: 这题数据范围这么小,直接暴力枚举 进行状态转移,只有状态 i 中存在两个位 1 的地方,就可以进行状态转移了,当然也可以使用枚举状态 i 的子集 j,count(s)-count(j)==2就可以进行转移了,dp[i]=max(dp[i],dp[j]+count(s)/2*dp[i^j]);,这里的 dp 需要先预处理一下在做。 代码如下: class Solution { public: // 思路:状压 dp int maxScore(vector<in

algsup 636

LeetCode——1799. N 次操作后的最大分数和(Maximize Score After N Operations)[困难]——分析及代码(Java)

LeetCode——1799. N 次操作后的最大分数和[Maximize Score After N Operations][困难]——分析及代码[Java]一、题目二、分析及代码1. 预处理 + 状态压缩 + 动态规划(1)思路(2)代码(3)结果三、其他 一、题目 给你 nums ,它是一个大小为 2 * n 的正整数数组。你必须对这个数组执行 n 次操作。 在第 i 次操作时(操作编号从 1 开始),你需要: 选择两个元素 x 和 y 。 获得分数 i * gcd(x, y) 。 将 x 和 y

江南土豆的博客 857

leetcode1799. N 次操作后的最大分数和(状压dp)

题面 程序 class Solution { public: int gcd(int a,int b){ return b?gcd(b,a%b):a; } int maxScore(vector<int>& nums) { int n=nums.size(); // dp[i]:i看成二进制数,所有为1的位数表示还没有选,0的位数表示已经选过了。 //表示所有状态为i的情况下开始,继续游戏的

m0_37891595的博客 295

DAY1_leetcode

1.两数之和 1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 Map<Integer, Integer> map = new HashMap<>(); 4 for(int i = 0; i<nu...

Kate1799的博客 160

LeetCode 5695. N 次操作后的最大分数和(状压dp)

题意: 给你 nums ,它是一个大小为 2 * n 的正整数数组。你必须对这个数组执行 n 次操作。 在第 i 次操作时(操作编号从 1 开始),你需要: 选择两个元素 x 和 y 。 获得分数 i * gcd(x, y) 。 将 x 和 y 从 nums 中删除。 请你返回 n 次操作后你能获得的分数和最大为多少。 函数 gcd(x, y) 是 x 和 y 的最大公约数。 数据范围: 1 <= n <= 7 nums.length == 2 * n 1 <= nums[i] &

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 423

Leetcode 5695. N 次操作后的最大分数和 (状态压缩dp初步)

这道题目第一眼看上去就是暴搜,每次随便取两个数,然后走到下一层,直到所有数算完,回溯。然后求一个最大值。 当然也可以用状态压缩dp解决,f(i) 表示i状态下的最大值,i是构型对应整数表示,很容易想到转移方程,转移的时候从低位像高位转移即可。 class Solution { public: int maxScore(vector<int>& nums) { int n = nums.size(); vector<in...

wwxy1995的博客 368

LeetCode 1799. N 次操作后的最大分数和

给你nums,它是一个大小为2 * n的正整数数组。你必须对这个数组执行 n次操作。 在第i次操作时(操作编号从 1开始),你需要: 选择两个元素x 和y。 获得分数i * gcd(x, y)。 将x和y 从nums中删除。 请你返回 n次操作后你能获得的分数和最大为多少。 函数gcd(x, y)是x 和y的最大公约数。 示例 1: 输入:nums = [1,2] 输出:1 解释:最优操作是: (1 * gcd(1, 2)) = 1 示例 2: ...

XY_xyz_xyz的博客 1504

LeetCode 5695. N 次操作后的最大分数和 (入门级难度状态压缩)

5695. N 次操作后的最大分数和 class Solution { public: int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } int count(int s) { int res = 0; while (s) { res++; s -= s & -s; } ret

SongyangJi 410

5695. N 次操作后的最大分数和

思路 看到范围应该想到dfs或者状压。 那么为什么想状压,而不是dfs呢? 首先dfs的话存在大量重复的可能。 就是假设你前面都删除的都一样,但是到了后面的某一次操作选了不一样的, 那其实最后一部分要去计算多次而已,但是跑dfs的话,前面一样的操作会大量的进行。 dp[sta]表示当前选了的数字的二进制串为st时候的最大值。 那么转移也很简单,我们从sta这个二进制串中去掉任意两个,枚举上一个二进制串last 那么last其实就是sta(1<<i)(1<<j) 维护dp[sta]的最

菜鸡的学习记录 434

LeetCode 每日一题 2026/11/2-2026/11/8

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

AlphaTao的博客 175
上一篇: 【LeetCode每日一题:1753. 移除石子的最大得分~~~贪心+优先队列】
下一篇: 【LeetCode每日一题:2011. 执行操作后的变量值~~~模拟】
硕风和炜
硕风和炜 优质创作者: Java技术领域 优质创作者: Java技术领域
博客等级 码龄7年 2万+粉丝 1024原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值