设表示前
个帽子状态为
的合法方案数,
表示
里这些人是否戴了帽子的集合。
那么对于第个帽子,要么只有一个人戴,要么没有人戴。
所以对于合法的第个人戴这个帽子或者没有人戴。
没有人戴这个帽子。
合法的第
个人戴这个帽子。
复杂度
class Solution {
public:
int g[43][11];
int dp[42][1025]={0};
const int mod=1e9+7;
int numberWays(vector<vector<int>>& hat) {
int n=hat.size();
for(int i=0;i<n;i++){
for(int j:hat[i])
g[j][i]=1;
}
dp[0][0]=1;
for(int i=1;i<=40;i++){
for(int j=-1;j<n;j++){
for(int k=0;k<(1<<n);k++){
if(j==-1)dp[i][0|k]=dp[i-1][k];
else{
if(g[i][j]&&!(1<<j&k)){
dp[i][1<<j|k]+=dp[i-1][k];
dp[i][1<<j|k]%=mod;
}
}
}
}
}
return dp[40][(1<<n)-1];
}
};
京公网安备 11010502036488号