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

【LeetCode】3670. 没有公共位的整数最大乘积 (SOSDP)

3670. 没有公共位的整数最大乘积 - 力扣(LeetCode)

题目:

思路:

SOSDP

本题我们显然不能枚举每一个数对,n² 的复杂度显然超时,所以考虑优化

我们考虑一个二进制数 mask,因为我们必须要选没有任何公共位置的数才行,那么我们参考集合论,其实就是去找 ~mask 的子集中的最大值

那么显然问题变为如何找子集的最大值,我们可以考虑动态规划的思想,假设如果我们要找 mask 的子集最大值,那么是不是可以找 mask 所有子集的子集的最大值,以此类推,我们可以一步一步求出所有子集的最大值

具体的,我们定义 f[i] 为 i 的子集中的最大值,初始化 f[x] = x(如果含有 x),然后套板子即可

其实这就是板子的变形,从求前缀和变成了前缀最大值,具体实现看代码

前缀和情况如下

//从地位向高位枚举
for (int i = 0; i < k; i++) {//枚举状态for (int mask = 0; mask < (1 << k); mask++) {//判断这一位有没有,即是不是子集if (mask >> i & 1) f[mask] += f[mask ^ (1 << i)];}
}

代码:

class Solution {
public:long long maxProduct(vector<int>& nums) {int mx = 0;for (auto& x : nums)mx = max(mx, x);int m = __lg(mx) + 1;mx = 1 << m;vector<int> f(mx,0);for (auto & x : nums)f[x] = x;for (int i = 0; i < m; i++) {for (int j = 0; j < mx; j++) {if (j >> i & 1) {f[j] = max(f[j], f[j ^ (1 << i)]);}}}long long ans = 0;for (auto& x : nums) {int buji = (mx - 1) ^ x;ans = max(ans, 1LL * x * f[buji]);}return ans;}
};

http://www.xdnf.cn/news/19772.html

相关文章:

  • Day19_【机器学习—线性回归 (3)—回归模型评估方法】
  • Docker一键快速部署压测工具,高效测试 API 接口性能
  • ES6手录01-let与const
  • 学习日记-spring-day47-9.1
  • PyCharm 2025版本中新建python工程文件自动创建.venv的意义和作用
  • 教育 AI 的下半场:个性化学习路径生成背后,技术如何平衡效率与教育本质?
  • 第二十八天-DAC数模转换实验
  • “便农惠农”智慧社区系统(代码+数据库+LW)
  • 【深度学习基础】深度学习中的早停法:从理论到实践的全面解析
  • OpenCV C++ 入门实战:从基础操作到类封装全解析
  • UART控制器——ZYNQ学习笔记14
  • QT中的HTTP
  • GSM8K 原理全解析:从数学推理基准到大模型对齐的试金石
  • 五、练习2:Git分支操作
  • 安卓版 Pad 搭载 OCR 证件识别:酒店入住登记的高效解法
  • 永磁同步电机无速度算法--高频脉振方波注入法(新型位置跟踪策略)
  • Meteor主题友链页面自研
  • QT中的TCP
  • HTML应用指南:利用GET请求获取全国招商银行网点位置信息
  • IS-IS的原理
  • MySQL 性能调优与 SQL 优化的核心利器
  • Windows 命令行:cd 命令1,cd 命令的简单使用
  • 【软件开发工程师の校招秘籍】
  • 安装nodejs安装node.js安装教程(Windows Linux)
  • 盲盒抽谷机小程序开发:如何用3D技术重构沉浸式体验?
  • 闭包的简单讲解
  • LeetCode 19: 删除链表的倒数第 N 个结点
  • 捡捡java——4、日志
  • 数据结构:单链表的应用(力扣算法题)第二章
  • MJ Prompt Tool-好用的Midjourney提示词工具