给出长度为n的数组a,长度为m的数组b。($n,m<=200, 0<=a_i,b_i<2^9$)
现在对于每个$a_i$,需要从b中寻找一个数$b_j$,使得$c_i = a_i\&b_j$
我们需要求出最小的$c_1 | c_2 | \cdots | c_n$
">Boboniu and Bit Operations
Boboniu and Bit Operations
Created by LXC on Tue May 2 01:22:09 2023
https://codeforces.com/problemset/problem/1395/C
ranting: 1600
tag: bitmasks, brute force, dp, greedy
题意
给出长度为n的数组a,长度为m的数组b。($n,m<=200, 0<=a_i,b_i<2^9$)
现在对于每个$a_i$,需要从b中寻找一个数$b_j$,使得$c_i = a_i&b_j$
我们需要求出最小的$c_1 | c_2 | \cdots | c_n$
题解
数据范围很小直接dp
设$f_{i,j}$ 为前i组数中(共有n组数,每组数中有m个数,每组数中必须且只能选一个)选出的数的或和能否是j($j<2^9$),$f_{i,j}=0/1$代表否/是。
显然$f_{1,a_1&b_i} = 1, i \in [1,m]$
对于$f_{i,j}=1$,则有$f_{i+1, j|a_{i+1}&b_k}, k \in [1,m]$
时间复杂度$O(nms)$,n为a的大小,m为b的大小,s为数组数值范围。
代码
1 |
|