[
bit-dp
dp
]
BinarySearch 0714 Polyglot Contest
Problem statement
https://binarysearch.com/problems/Polyglot-Contest/
Solution
First of all, number of languages can be upto 32
, so the is not way we can check all masks for languages. So, instead we will check masks for persons. We have state dp(idx, mask)
, where idx
is the index of language and mask
is mask of persons we covered, which know at least one language so-far. Then we have two options:
- Either add new language to group of languages we choose, then we can update our
mask
asmask & ~d2[idx]
: here we do difference of sets:d2[idx]
is mask for persons indexes who know this language. - Or do not add new language.
Complexity
It is O(2^n * l)
, where n = len(A)
and l
is total number of languages.
Code
class Solution:
def solve(self, A):
skills = list(set(chain(*A)))
d = {s:i for i, s in enumerate(skills)}
d2 = Counter() #language: persons
for i, row in enumerate(A):
for lang in row:
d2[d[lang]] += 1<<i
l, n = len(d2), len(A)
@lru_cache(None)
def dp(idx, mask):
if not mask: return 0
if idx == l: return float("inf")
return min(dp(idx + 1, mask), 1 + dp(idx + 1, mask & ~d2[idx]))
return dp(0, (1<<n) - 1)