1434. Number of Ways to Wear Different Hats to Each Other
SourceBiweekly Contest 25 Q4DifficultyHardRating2273
Description
There are n people and 40 types of hats labeled from 1 to 40.
Given a 2D integer array hats, where hats[i] is a list of all hats preferred by the ith person.
Return the number of ways that n people can wear different hats from each other.
Since the answer may be too large, return it modulo 109 + 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 chooses hat 3, Second person chooses 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.
Constraints:
n == hats.length1 <= n <= 101 <= hats[i].length <= 401 <= hats[i][j] <= 40hats[i]contains a list of unique integers.
Solutions
Solution 1: Dynamic Programming
Thinking
There are \(n\le 10\) people and at most \(40\) hats. Assigning hats per person is awkward to compress. Enumerate hats instead and bit-mask who already wears one.
\(f[i][j]\) is the number of ways using the first \(i\) hats with assigned set \(j\). Hat \(i\) may be unused or given to a person \(k\) who likes it and is still free. The answer is \(f[m][2^n-1]\).
We notice that \(n\) is not greater than \(10\), so we consider using DP with state compression to solve this problem.
We define \(f[i][j]\) as the number of ways to assign the first \(i\) hats to the people whose state is \(j\). Here \(j\) is a binary number, which represents a set of people. We have \(f[0][0]=1\) at the beginning, and the answer is \(f[m][2^n - 1]\), where \(m\) is the maximum number of hats and \(n\) is the number of people.
Consider \(f[i][j]\). If we don't assign the \(i\)-th hat to anyone, then \(f[i][j]=f[i-1][j]\); if we assign the \(i\)-th hat to the person \(k\) who likes it, then \(f[i][j]=f[i-1][j \oplus 2^k]\). Here \(\oplus\) denotes the XOR operation. Therefore, we can get the state transition equation:
where \(like[i]\) denotes the set of people who like the \(i\)-th hat.
The final answer is \(f[m][2^n - 1]\), and the answer may be very large, so we need to take it modulo \(10^9 + 7\).
Time complexity \(O(m \times 2^n \times n)\), space complexity \(O(m \times 2^n)\). Here \(m\) is the maximum number of hats, which is no more than \(40\) in this problem; and \(n\) is the number of people, which is no more than \(10\) in this problem.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |