題意: 給出兩個非負整數的陣列a,b,長度分別爲n,m。設對於 有 & ,求 的最小值。,,。
思路: 本題有兩個切入點。
一、由於均不超過九位二進制數,所以可以直接從小到大列舉答案ans,當 時即爲答案。(按位元或運算的性質
二、對於表達式的值,直接暴力計算出所有可能的結果,然後取最小的。由於結果可以直接 dp 轉移狀態。
Code1:
#include<bits/stdc++.h>
using namespace std;
const int N = 210;
int a[N],b[N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) cin>>b[i];
for(int i=0;i<(1<<10);i++){
int num=0;
for(int j=1;j<=n;j++){
int flag = 0;
for(int k=1;k<=m;k++){
if(((a[j]&b[k])|i)==i) flag=1;
}
if(flag) num++;
}
if(num==n) {
cout<<i<<"\n";return 0;
}
}
}
Code2:
#include<bits/stdc++.h>
using namespace std;
const int N = 210,M=1<<10;
int a[N],b[N],dp[N][M];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) cin>>b[i];
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int add = a[i]&b[j];
for(int k=0;k < M;k++)
if(dp[i-1][k]) dp[i][k|add]=1;
}
}
for(int i=0;i<M;i++){
if(dp[n][i]){
cout <<i;
return 0;
}
}
}