部分文章内容为公开资料查询整理,原文出处可能未标注,如有侵权,请联系我,谢谢。邮箱地址:gnivor@163.com ►►►需要气球么?请点击我吧!

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}}))

}

posted @ 2022-08-19 23:42  流了个火  阅读(34)  评论(0)    收藏  举报
►►►需要气球么?请点击我吧!►►►
View My Stats