【C++动态规划 状压dp】1879. 两个数组最小的异或值之和|2145

【C++动态规划 状压dp】1879. 两个数组最小的异或值之和|2145

本文涉及知识点

C++动态规划 状态压缩dp

LeetCode1879. 两个数组最小的异或值之和

给你两个整数数组 nums1 和 nums2 ,它们长度都为 n 。
两个数组的 异或值之和 为 (nums1[0] XOR nums2[0]) + (nums1[1] XOR nums2[1]) + … + (nums1[n - 1] XOR nums2[n - 1]) (下标从 0 开始)。
比方说,[1,2,3] 和 [3,2,1] 的 异或值之和 等于 (1 XOR 3) + (2 XOR 2) + (3 XOR 1) = 2 + 0 + 2 = 4 。
请你将 nums2 中的元素重新排列,使得 异或值之和 最小 。
请你返回重新排列之后的 异或值之和 。
示例 1:
输入:nums1 = [1,2], nums2 = [2,3]
输出:2
解释:将 nums2 重新排列得到 [3,2] 。
异或值之和为 (1 XOR 3) + (2 XOR 2) = 2 + 0 = 2 。
示例 2:
输入:nums1 = [1,0,3], nums2 = [5,3,4]
输出:8
解释:将 nums2 重新排列得到 [5,4,3] 。
异或值之和为 (1 XOR 5) + (0 XOR 4) + (3 XOR 3) = 4 + 4 + 0 = 8 。

提示:
n == nums1.length
n == nums2.length
1 <= n <= 14
0 <= nums1[i], nums2[i] <= 107

动态规划

动态规划的状态表示

dp[i][mask] 表示nums1的前i个元素已经处理,mask表示nums2各元素处理状态 mask &(1<<j) 表示第j个元素是否已经处理。空间复杂度:O(2nn)

动态规划的填报顺序

枚举前置状态 i 从 0 到 n-1

动态规划的转移方程

∀ \forall ∀ i,mask
for j = 0 ; j < N ; j++
如果nums2[j]已经处理,则忽略。
MinSelf(dp[i+1][mask |(1<<j)] ,dp[i][mask]+nums1[i] xor nums2[j])
时间复杂度:O(nn2n)

动态规划的初始化

dp[0][0]=0,其它全为INT_MAX/2。

动态规划的返回值

dp.back().back()

代码

核心代码

classSolution{public:intminimumXORSum(vector<int>& nums1, vector<int>& nums2){constint N = nums1.size();constint MC =1<< N; vector<int>pre(MC, INT_MAX /2); pre[0]=0;for(int i =0; i < N; i++){ vector<int>cur(MC, INT_MAX /2);for(int m =0; m < MC; m++)for(int j =0; j < N; j++){if((1<< j)& m){continue;} cur[m |(1<< j)]=min(cur[m |(1<< j)], pre[m]+(nums1[i]^ nums2[j]));} pre.swap(cur);}return pre.back();}};

单元测试

 vector<int> nums1,nums2;TEST_METHOD(TestMethod11){ nums1 ={1,2}, nums2 ={2,3};auto res =Solution().minimumXORSum(nums1, nums2);AssertEx(2, res);}TEST_METHOD(TestMethod12){ nums1 ={1,0,3}, nums2 ={5,3,4};auto res =Solution().minimumXORSum(nums1, nums2);AssertEx(8, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步ZEEKLOG学院,听白银讲师(也就是鄙人)的讲解。
https://edu.ZEEKLOG.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.ZEEKLOG.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

Read more

SORT 追踪算法详解 + 应用场景 + 完整 C# 案例代码

SORT 追踪算法详解 + 应用场景 + 完整 C# 案例代码 一、SORT 追踪算法完整详解 SORT(Simple Online and Realtime Tracking)是 2016 年提出的经典多目标追踪算法,至今在很多对实时性和简单性要求高的工业场景中仍然被广泛使用。 核心思想: “检测 + 卡尔曼滤波预测 + IOU 匹配”,用最少的计算量实现实时追踪。 SORT 完整工作流程(只有 3 步) 1. 检测 每一帧都依赖检测器(YOLO、Faster R-CNN 等)给出当前帧所有目标的 bounding box + 置信度 只使用置信度高于阈值(通常 0.5)的框 2. 预测 对每一条已有轨迹,用

By Ne0inhk

模板编译期排序算法

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if * find(begin, end, value):查找第一个等于 value 的元素,返回迭代器(未找到返回 end)。 * find_if(begin, end, predicate):查找第一个满足谓词的元素。 * find_end(begin, end, sub_begin, sub_end):查找子序列最后一次出现的位置。 vector<int> nums = {1, 3, 5, 7, 9}; // 查找值为5的元素 auto it = find(nums.begin(

By Ne0inhk
程序员怎样才能学好算法?这本书送几本给大家!

程序员怎样才能学好算法?这本书送几本给大家!

文章目录 * 前言 * 一、笔者对算法的理解 * 二、写书的初衷及过程 * 三、主要内容 * 四、本书的内容 * 五、联合推荐 * 六、购买方式 * 七、《算法秘籍》 * 中奖者名单 前言 提示:这里可以添加本文要记录的大概内容: 数据结构和算法是计算机科学的基石,是计算机的灵魂,要想成为计算机专业人员,学习和掌握算法是十分必要的。不懂数据结构和算法的人不可能写出效率更高的代码。计算机科学的很多新行业都离不开数据结构和算法作为基石,比如大数据、人工智能等。底层开发中也需要使用非常多的数据结构和算法知识,以保证底层系统的稳定性和高效性。 提示:以下是本篇文章正文内容,下面案例可供参考 一、笔者对算法的理解 计算机科学家尼古拉斯·沃斯在计算机领域有一句人尽皆知的名言: “算法+数据结构=程序”(Algorithms+Data Structures=Programs) 所以数据结构和算法是程序员必须掌握的技能。尤其是到一些大公司面试的时候,算法更是一个少不了的环节,熟练掌握数据结构和算法,可以开拓我们的视野,提高我们的逻辑思维能力,

By Ne0inhk
数据结构【AVL树】

数据结构【AVL树】

AVL树 * 1.AVL树 * 1.1AVL的概念 * 1.2平衡因子 * 2.AVl树的实现 * 2.1AVL树的结构 * 2.2AVL树的插入 * 2.3 旋转 * 2.3.1 旋转的原则 1.AVL树 1.1AVL的概念 AVL树可以是一个空树。 它的左右子树都是AVL树,且左右子树的高度差的绝对值不超过1。AVL树是一颗高度平衡搜索二叉树,通过控制高度差去控制平衡。 AVL树整体结点数量和分布和完全二叉树类似,高度可以控制在 logN ,那么增删查改的效率也可以控制在O(logN ) ,相比二叉搜索树有了本质的提升。 1.2平衡因子 结点的平衡因子=右子树的高度减去左子树的高度,也就是说任何结点的平衡因子等于0/1/-1,AVL树并不是必须要平衡因子,但是有了平衡因子可以更方便我们去进行观察和控制树是否平衡,就像⼀个风向标一样。 为什么AVL树是高度平衡搜索二叉树,要求高度差不超过1,而不是高度差是0呢? 因为例如二和四个结点无法达到0.

By Ne0inhk