LeetCode-in-Java

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

Hard

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 the n people wear different hats to 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 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.

Constraints:

Solution

import java.util.List;

public class Solution {
    public int numberWays(List<List<Integer>> hats) {
        long mod = 1000000007L;

        int size = hats.size();
        boolean[][] possible = new boolean[size][41];

        for (int i = 0; i < size; i++) {
            for (int j : hats.get(i)) {
                possible[i][j] = true;
            }
        }
        long[] dp = new long[1 << size];
        dp[0] = 1;
        for (int i = 1; i <= 40; i++) {
            for (int j = dp.length - 1; j > 0; j--) {
                for (int k = 0; k < size; k++) {
                    if (((j >> k) & 1) == 1 && possible[k][i]) {
                        dp[j] += dp[j ^ (1 << k)];
                    }
                }
                dp[j] %= mod;
            }
        }
        return (int) dp[(1 << size) - 1];
    }
}