leetcodeSolution to some Leetcode problems written in C++ |
git clone git://git.dimitrijedobrota.com/leetcode.git |
Log | Files | Refs | README | LICENSE |
1125.cpp (1118B)
0 class Solution {
1 public:
2 vector<int> smallestSufficientTeam(vector<string> &req_skills, vector<vector<string>> &people) {
3 int n = people.size(), m = req_skills.size();
4 unordered_map<string, int> index;
5 for (int i = 0; i < m; i++)
6 index[req_skills[i]] = i;
7 vector<int> masks(n);
8 for (int i = 0; i < n; i++) {
9 for (string skill : people[i])
10 masks[i] |= 1 << index[skill];
11 }
13 vector<long long> dp(1 << m, (1LL << n) - 1);
14 dp[0] = 0;
15 for (int mask = 1; mask < (1 << m); mask++) {
16 for (int i = 0; i < n; i++) {
17 int smask = mask & ~masks[i];
18 if (smask == mask) continue;
19 long long pmask = dp[smask] | (1LL << i);
20 if (__builtin_popcountll(pmask) < __builtin_popcountll(dp[mask])) dp[mask] = pmask;
21 }
22 }
24 long long answerMask = dp[(1 << m) - 1];
25 vector<int> res;
26 for (int i = 0; i < n; i++) {
27 if ((answerMask >> i) & 1) res.push_back(i);
28 }
29 return res;
30 }
31 };