最淳朴的状压dp,然而却紫了……
#include<bits/stdc++.h>
#define mod 10007
using namespace std;
int n,m,dp[225][1<<15],s[225][1<<15],cnt[225],ans;
char b[225][225];
void init(){
for(int i=0;i<(1<<m);i++){
if(!(i&(i<<1))){
for(int j=0;j<n;j++){
bool flag=1;
for(int k=0;k<m;k++){
if(b[j][k]=='1'&&!((i>>k)&1)||b[j][k]=='0'&&((i>>k)&1)){
flag=0;
break;
}
}
if(flag) s[j][cnt[j]++]=i;
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
if(n<m){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
char c=getchar();
while(c!='0'&&c!='1'&&c!='.') c=getchar();
b[j][i]=c;
}
}
swap(n,m);
}else{
for(int i=0;i<n;i++) scanf("%s",b[i]);
}
init();
for(int i=0;i<cnt[0];i++) dp[0][i]=1;
for(int i=1;i<n;i++){
for(int j=0;j<cnt[i];j++){
for(int k=0;k<cnt[i-1];k++){
if(s[i][j]&s[i-1][k]) continue;
dp[i][j]=(dp[i][j]+dp[i-1][k])%mod;
}
}
}
for(int i=0;i<cnt[n-1];i++) ans=(ans+dp[n-1][i])%mod;
printf("%d",ans);
return 0;
}
明日csp,今日夜晚熬夜通宵