题意
这个题的意思是说给你两个数组a和b,长度分别为n和m,现在你需要找到一个序列c长度为n,
c
i
=
a
i
c_i=a_i
ci=ai &
b
k
(
1
<
=
k
<
=
m
)
b_k(1<=k<=m)
bk(1<=k<=m)
求出
的最小值
思路
这个题就是dp,但是我个人认为还是不太好想。
d
p
[
i
]
[
j
]
=
0
/
1
dp[i][j]=0/1
dp[i][j]=0/1代表前
c
i
c_i
ci个单位是否存在
c
1
∣
c
2
∣
.
.
.
∣
c
i
=
j
c_1|c_2|...|c_i=j
c1∣c2∣...∣ci=j
状态转移方程
d
p
[
i
]
[
j
∣
(
a
i
)
dp[i][j|(a_i)
dp[i][j∣(ai) &
(
b
j
)
]
(b_j)]
(bj)]由
d
p
[
i
−
1
]
[
j
]
dp[i-1][j]
dp[i−1][j]转移而来又因为在本题只要有一个存在就可以,因此状态转移方程就是
d
p
[
i
]
[
j
∣
(
a
i
)
dp[i][j|(a_i)
dp[i][j∣(ai) &
(
b
j
)
]
∣
=
(b_j)] |=
(bj)]∣=
d
p
[
i
−
1
]
[
j
]
dp[i-1][j]
dp[i−1][j](取一个或,因为这个只要有一个状态存在,就说明这个状态是存在的)
#include<iostream>
using namespace std;
int a[2102100];
int b[2102100];
int dp[1000][2000];
int main(){
//这个是看题解的写博客
int aa,bb;
cin>>aa>>bb;
for(int i=1;i<=aa;i++)cin>>a[i];
for(int i=1;i<=bb;i++)cin>>b[i];
dp[0][0]=1;
for(int i=1;i<=aa;i++){
for(int j=1;j<=bb;j++){
int x=a[i]&b[j];
for(int k=0;k<=1024;k++){
dp[i][k|x]|=dp[i-1][k];
}
}
}
for(int i=0;i<=1024;i++){
if(dp[aa][i]){
cout<<i<<endl;
return 0;
}
}
//cout<<"nope"<<endl;
}