题解转自:点击打开链接
这边有个小技巧:%2^32可以直接将变量设成unsigned int
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef unsigned int UI;
const int N=20;
UI dp[1<<N];
int vis[1<<N],n;
char a[N][N];
UI RP(UI a,UI b)
{
UI ans=1;
for (;b;b>>=1){
if (b&1)ans*=a;
a*=a;
}
return ans;
}
void work()
{
scanf("%d",&n);
for (int i=0;i<n;i++)scanf("%s",a[i]);
int maxmask=1<<n;
for (int mask=1;mask<maxmask;mask++)vis[mask]=0;
for (int mask=1;mask<maxmask;mask++)for (int i=0;i<n;i++)if (1<<i&mask){
for (int j=0;j<n;j++)if ((1<<j&mask) && a[i][j]=='1'){vis[mask]=1;break;}
if (vis[mask])break;
}
UI ans=0;
for (int mask=1;mask<maxmask;mask++){
dp[mask]=100;
for (int ma=mask;ma;ma=(ma-1)&mask)if (!vis[ma]){
dp[mask]=min(dp[mask],dp[mask^ma]+1);
}
ans+=dp[mask]*RP(233,mask);
}
printf("%u\n",ans);
}
int main()
{
int Case;scanf("%d",&Case);
while (Case--)work();
return 0;
}