这范围一看就是显然状压,刚开始一直想一维dp直接状压,发现不行。。。因为这两个数组是独立的,然后发现只需要在开一维表示选了前i个即可。
dp[i][j]表示选了前i个第一个数组中的数字后此时第二个数组的二进制状态是j的异或和的最小值
dp[i][nxt]=min(dp[i][nxt],dp[i-1][st]+(nums1[i] ^ nums2[k]))
其中st是第二个数组的二进制状态,nxt= st | 1<<k
初始化的话就是一开始所有数字赋值无穷大
然后dp[i][1<<j]=nums1[i] ^ nums2[j]
class Solution {
public:
int dp[16][1<<16];
int minimumXORSum(vector<int>& nums1, vector<int>& nums2) {
int n=nums1.size();
int limit=1<<n;
memset(dp,63,sizeof dp);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
dp[i+1][1<<j]=nums1[i]^nums2[j];
}
}
for(int i=2;i<=n;i++){
for(int st=1;st<limit;st++){
for(int k=0;k<n;k++){
if(!(st>>k&1)){
int nxt=st|(1<<k);
dp[i][nxt]=min(dp[i][nxt],dp[i-1][st]+(nums1[i-1]^nums2[k]));
}
}
}
}
return dp[n][limit-1];
}
};