状态压缩dp
#include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<iostream> #define maxn 16 using namespace std; long long dp[1<<maxn]; long long weapon[1<<maxn]; int robot[maxn]; char s[maxn+10]; int main() { int t,n,ca=1; scanf("%d",&t); while(t--) { scanf("%d",&n); scanf("%s",s); int ini=0; for(int i=0;i<n;i++) if(s[i]=='1') ini|=(1<<i); for(int i=0;i<n;i++) { scanf("%s",s); robot[i]=0; for(int j=0;j<n;j++) if(s[j]=='1') robot[i]|=(1<<j); } int all=(1<<n)-1; for(int i=0;i<=all;i++) { weapon[i]=ini; for(int j=0;j<n;j++) if(i&(1<<j)) weapon[i]|=robot[j]; } dp[0]=1; for(int i=1;i<=all;i++) { dp[i]=0; for(int j=0;j<n;j++) { if(i&(1<<j)&&(weapon[i-(1<<j)]&(1<<j))) dp[i]+=dp[i-(1<<j)]; } } printf("Case %d: %lld ",ca++,dp[all]); } return 0; }