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

news2024/11/18 5:28:41

题目描述

给你 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);
    }

}

运行结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

07. 渗透测试之针对网站的信息收集

07. 渗透测试之针对网站的信息收集 01 信息收集简介 什么是信息收集 信息收集&#xff08;Information Gathering&#xff09;是指通过各种方式获取所需要的信息。信息收集是信息得以利用的第一步&#xff0c;也是关键的一步。信息收集工作的好坏&#xff0c;会影响整个渗透…

全国各城市疫情达峰进度条感染高峰时间表最新

防疫政策放开之后&#xff0c;多位专家就研判&#xff0c;未来一个多月内全国疫情将达到感染高峰。而近日&#xff0c;一张全国各地疫情进度和最终高峰的预计时间表流传&#xff0c;对各城市首轮感染高峰期进行了预测。那么&#xff0c;全国各城市疫情达峰进度条如何了&#xf…

怎么高效的开发一款成功的产品?Working Backwards

过去的几天一直在回顾整个产品团队过去一年所做的工作&#xff0c;有的工作有亮点&#xff0c;有的工作可以说是乏善可陈。对于不好的&#xff0c;发现其中的一个核心原因就是没有坚持“以终为始”的原则。现将我2021年10月写的一篇公司内部博客再次分享给团队&#xff0c;也分…

Simple Yet Effective Graph Contrastive Learning for Recommendation

1. 摘要 图神经网络(GNN)是一种强大的基于图的推荐系统学习方法。最近&#xff0c;结合对比学习的gnn在处理高度稀疏数据时&#xff0c;在数据增强方案的推荐方面表现出了优异的性能。尽管它们取得了成功&#xff0c;但大多数现有的图对比学习方法要么在用户-项目交互图上执行随…

JAVA零基础小白学习教程之day08_接口多态

day08-JAVAOOP 课程目标 1. 【理解】什么是接口 2. 【掌握】接口的定义格式 3. 【掌握】接口的使用 4. 【理解】接口的成员特点 5. 【理解】类和接口 抽象类和接口之间的关系 6. 【掌握】单继承多实现 7. 【理解】接口之间的多继承 8. 【掌握】接口的案例 9. 【理解】什么是…

一个程序员的新冠防护最佳实践

至今未阳&#xff0c;做了几次抗原检测都是阴性&#xff0c;所以把个人的防护经验给广大程序员朋友分享一下&#xff0c;尤其家里有小孩老人的可以参考一下。 我一天的防护操作 1、午餐 吃午饭时&#xff0c;走楼梯不去挤电梯&#xff0c;而且是在其他人吃完饭后&#xff0c…

Unreal Engine中调试常用方法

目录 常用调试方法 AddOnScreenDebugMessage UE_LOG&#xff1a;在控制台看调试信息 在蓝图中直接调用PrintString 自定义日志分类 声明 定义 简化日志输出的宏 日志格式化输出 常用调试方法 在虚幻引擎中常用的打印日志方法有三种&#xff0c;分别是&#xff1a;UE_…

C++运算符重载,匿名对象

目录 1、加号运算符重载 1.1 通过自己写成员函数&#xff0c;实现两个对象相加属性后返回新的对象 1.2通过成员函数实现加法运算符重载 1.3通过全局函数实现加法运算符重载&#xff0c;运算符重载也可以发生函数重载 1.4总结--对于内置的数据类型的表达式运算符是不可以改变…

Python+Requests实现接口自动化测试

一般对于自动化的理解&#xff0c;有两种方式的自动化。 第一&#xff0c;不需要写代码&#xff0c;完全由工具实现&#xff0c;这种方式的工具一般是公司自己研发的&#xff0c;方便黑盒测试人员使用。这种工具的特点是学习成本低&#xff0c;方便使用&#xff0c;但是通用性…

面向5G C-RAN组网的机房配置标准与模型

【摘 要】当前5G网络建设成本高,投资压力大,基站建设进度受铁塔公司制约;基站机房电费、租赁、服务费用逐年上升,运营维护压力大。面向未来5G建设,通过C-RAN组网,实现BBU集中化部署,可促进降本增效,实现低成本建网。首先分析了C-RAN区所处的网络位置,其次从BBU框多基…

java基于springboot的心理健康管理网站-计算机毕业设计

运行环境&#xff1a; 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务:Tomcat7/Tomcat8 使用框架springbootvue 项目介绍 心灵治愈交流平台的主要使用者分为管理员和用户、心理咨询师&#xff0c;实现功能包括管理员&#xff1a;首页、个人中心、系统公告管理、用户管理、心…

网上订餐项目(附源代码及数据库)

目录 一、项目概要 二、项目展示 三、数据库 四、项目源码 五、毕设专栏 首页 登录界面 注册页面 一、项目概要 系统主要功能模块有&#xff1a; &#xff08;1&#xff09;首页菜品&#xff1a;主要包括购买菜品、菜品加入购物车的功能 &#xff08;2&#xff09;我的…

django-rest-framework

文章目录 &#xff08;1&#xff09;Web应用模式及API接口 &#xff08;2&#xff09;Restful规范 &#xff08;3&#xff09;drf安装和简单使用 &#xff08;4&#xff09;源码分析 &#xff08;5&#xff09;序列化器-Serializer &#xff08;6&#xff09;局部和全局响应配…

STL篇之vector

一、介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它…

NR HARQ (四)dynamic codebook

微信同步更新欢迎关注同名modem协议笔记 上篇提到type-1 HARQ-ACK codebook&#xff0c;即semi-static codebook&#xff0c;UE要为每个PDSCH候选位置生成反馈&#xff0c;也会包含实际没有下行传输的PDSCH&#xff0c;再加上配置CBG的场景&#xff0c;HARQ-ACK 码本中包含的无…

SpringBoot系列之数据库初始化-datasource配置方式

在我们的日常业务开发过程中&#xff0c;如果有db的相关操作&#xff0c;通常我们是直接建立好对应的库表结构&#xff0c;并初始化对应的数据&#xff0c;即更常见的情况下是我们在已有表结构基础之下&#xff0c;进行开发&#xff1b; 但是当我们是以项目形式工作时&#xff…

java微信支付v3系列——3.订单创建准备操作

微信支付的下单操作分为了5种&#xff0c;分别是JSAPI、APP、H5以及Native支付及小程序支付&#xff0c;之所以将支付放在单独一个章节&#xff0c;而不是按照支付类型划分一个章节&#xff0c;是因为支付所传递的数据都是相似的&#xff0c;方便我们更好的封装。 本章节是支付…

20221222英语学习

托福词汇 sociology n.社会学 given adj.规定的&#xff0c;特定的&#xff1b;假定的 narrative n.叙述&#xff1b;记叙体&#xff0c;叙述技巧 deplore vt.悲叹&#xff0c;哀叹&#xff0c;公开谴责 despoil vt.夺取&#xff0c;掠夺&#xff1b;毁坏&#xff0c;破坏…