当前位置: 代码迷 >> 综合 >> LeetCode 1434 - 每个人戴不同帽子的方案数(双周赛)
  详细解决方案

LeetCode 1434 - 每个人戴不同帽子的方案数(双周赛)

热度:50   发布时间:2023-12-13 04:01:31.0

题目描述

1434. 每个人戴不同帽子的方案数

解法:状态压缩DP(C++)

详细参考 lucifer1004的解

针对代码解释一下,状态转移方程表述的是后面的状态由前面的状态决定,而我们编码的时候是先处理前面的状态,再慢慢推到后面的状态

class Solution {
    
public:int numberWays(vector<vector<int>>& hats) {
    const long long MOD = 1e9+7;int n = hats.size();vector<long long> dp(1<<n);vector<set<int>> s(41);dp[0] = 1;for(int i=0;i<n;i++)for(int hat: hats[i])s[hat].insert(i);for(int i=1;i<=40;i++){
    vector<long long> ndp(dp);for(int state=(1<<n)-1;state>=0;state--){
    for(int person: s[i]){
    if(state&(1<<person)) continue;int nxt = state+(1<<person);ndp[nxt] += dp[state];ndp[nxt] %= MOD;}}swap(dp, ndp);}return dp[(1<<n)-1];}
};