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

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

给你两个整数数组 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入门题。

状态表示:dp[i]为num2数组选取状态为i的异或和的最小值。
假如i=10=(1010),则说明已经选取了两个位置,第1个位置和第2个位置已经被选择。

状态划分:
根据已经选择的位置来划分
假设f[1110],对于中间的1,它是由f[1110]=min(f[1110],f[1010] + a[2]^b[1])
a[2]的2来源于1010已经由两个1,按照从0开始应该为2。

class Solution {
public:
    int minimumXORSum(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size();
        vector<int>dp(1<<n,1e9);
        dp[0] = 0;
        for(int i = 1; i < 1<<n; i++ ){
            int s = 0;
            for(int j = 0 ; j < n; j ++){
                if(i >> j & 1){
                    s ++;
                }
            }
            for(int j = 0; j < n; j++){
                if(i >> j & 1){
                    dp[i] = min(dp[i], dp[i - (1 << j)] + (nums1[s - 1]^nums2[j]));
                }
            }
        }
        return dp[(1<<n) - 1];
    }
};
上一篇:cf1582 F1. Korney Korneevich and XOR (easy version)(dp,暴力)


下一篇:[WC2011]最大XOR和路径