LeetCode--1434. 每个人戴不同帽子的方案数
https://leetcode.cn/problems/number-of-ways-to-wear-different-hats-to-each-other/
状态压缩dp
https://blog.csdn.net/u013377068/article/details/81054112
package main
import (
"fmt"
"math"
)
func numberWays(hats [][]int) int {
maxHat := 0
hatsMan := make(map[int][]int)
for i, man := range hats {
for _, hat := range man {
if hat > maxHat {
maxHat = hat
}
hatsMan[hat] = append(hatsMan[hat], i)
}
}
modNum := int64(math.Pow(10, 9) + 7)
menNum := len(hats)
status := make([][]int64, maxHat+1)
for i := 0; i < maxHat+1; i++ {
status[i] = make([]int64, (1 << menNum))
}
status[0][0] = 1
for i := 1; i <= maxHat; i++ {
for mask := 0; mask < (1 << menNum); mask++ {
status[i][mask] = status[i-1][mask]
for _, j := range hatsMan[i] {
if (mask>>j)&1 == 1 {
status[i][mask] += status[i-1][mask^(1<<j)]
status[i][mask] %= modNum
}
}
}
}
return int(status[maxHat][1<<menNum-1])
}
func main() {
fmt.Println(numberWays([][]int{{3, 5, 1}, {3, 5}}))
fmt.Println(numberWays([][]int{{1, 2, 3}, {2, 3, 5, 6}, {1, 3, 7, 9}, {1, 8, 9}, {2, 5, 7}}))
}

浙公网安备 33010602011771号