一般是把某一维数少的进行状态压缩
const int mod=1e9+7;
int dp[45][1<<10];
/*
dp[i][bits] 前i顶帽子确定了归属,人戴帽子的状态为bits的方案数
dp[i][bits]->dp[i+1][n_bits]
*/
class Solution {
public:
int numberWays(vector<vector<int>>& hats) {
int n=hats.size();
int limit=1<<n;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int h=1;h<=40;h++){
for(int s=0;s<limit;s++){
for(int i=0;i<n;i++){
if((s>>i)&1) continue;
if(find(hats[i].begin(),hats[i].end(),h)==hats[i].end()) continue;
int tt=(1<<i)|s;
dp[h][tt]=(dp[h][tt]+dp[h-1][s])%mod;
}
}
for(int s=0;s<limit;s++){
dp[h][s]=(dp[h][s]+dp[h-1][s])%mod;
}
}
return dp[40][limit-1];
}
};