欢迎留下你的见解 ^-^ ~~
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <queue> using namespace std; const int maxn=12+5; const int maxm=12+5; int n,m,tot; int state[380],stanum[380]; int in[maxm]; bool flg[maxn]; //char s[maxn][maxm]; void dfs(int cur,int st,int count) { if(cur==n) { state[tot]=st; stanum[tot++]=count; return; } flg[cur+1]=0; dfs(cur+1,st<<1,count); if(flg[cur]==0) { flg[cur+1]=1; dfs(cur+1,st<<1|1,count+1); } } void init() { tot=0; memset(flg,0,sizeof(flg)); dfs(0,0,0); } void data_in() { int tmp; for(int i=1;i<=m;i++) { in[i]=0; for(int j=1;j<=n;j++) { scanf("%d",&tmp); in[i]=in[i]*2+tmp^1; } } } int dp[2][380];//滚动数组wa了,非滚动ac void DP() { memset(dp,0,sizeof(dp)); for(int i=0;i<tot;i++) { if(in[1]&state[i]) continue; dp[1][i]=1; } for(int i=2;i<=m;i++) { for(int j=0;j<tot;j++) { if(in[i]&state[j]) continue; else for(int k=0;k<tot;k++) { if(state[j]&state[k]) continue; // else dp[i][j]=(dp[i][j]+dp[i-1][k])%100000000; else dp[i%2][j]=(dp[i%2][j]+dp[(i-1)%2][k])%100000000; } } } int ans=0; for(int i=0;i<tot;i++) // ans=(ans+dp[m][i])%100000000; ans=(ans+dp[m%2][i])%100000000; printf("%d\n",ans); } int main() { while(~scanf("%d %d",&m,&n)) { init(); data_in(); DP(); } return 0; }