Skip to content

Latest commit

 

History

History
 
 

1434. Number of Ways to Wear Different Hats to Each Other

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

There are n people and 40 types of hats labeled from 1 to 40.

Given a list of list of integers hats, where hats[i] is a list of all hats preferred by the i-th person.

Return the number of ways that the n people wear different hats to each other.

Since the answer may be too large, return it modulo 10^9 + 7.

 

Example 1:

Input: hats = [[3,4],[4,5],[5]]
Output: 1
Explanation: There is only one way to choose hats given the conditions. 
First person choose hat 3, Second person choose hat 4 and last one hat 5.

Example 2:

Input: hats = [[3,5,1],[3,5]]
Output: 4
Explanation: There are 4 ways to choose hats
(3,5), (5,3), (1,3) and (1,5)

Example 3:

Input: hats = [[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]
Output: 24
Explanation: Each person can choose hats labeled from 1 to 4.
Number of Permutations of (1,2,3,4) = 24.

Example 4:

Input: hats = [[1,2,3],[2,3,5,6],[1,3,7,9],[1,8,9],[2,5,7]]
Output: 111

 

Constraints:

  • n == hats.length
  • 1 <= n <= 10
  • 1 <= hats[i].length <= 40
  • 1 <= hats[i][j] <= 40
  • hats[i] contains a list of unique integers.

Related Topics:
Dynamic Programming, Bit Manipulation

Solution 1.

// OJ: https://leetcode.com/problems/number-of-ways-to-wear-different-hats-to-each-other/
// Author: github.com/lzl124631x
// Time: O(2^N * M)
// Space: O(2^N)
class Solution {
public:
    int numberWays(vector<vector<int>>& hats) {
        vector<vector<int>> persons(40);
        int N = hats.size(), mod = 1e9+7;
        vector<int> masks(1 << N);
        masks[0] = 1;
        for (int i = 0; i < N; ++i) {
            for (int h : hats[i]) persons[h - 1].push_back(i);
        }
        for (int i = 0; i < 40; ++i) {
            for (int j = (1 << N) - 1; j >= 0; --j) {
                for (int p : persons[i]) {
                    if (j & (1 << p)) continue;
                    masks[j | (1 << p)] += masks[j];
                    masks[j | (1 << p)] %= mod;
                }
            }
        }
        return masks[(1 << N) - 1];
    }
};