这是我的第一道状态压缩题目,思路神马的都不是我自己的,不过我还是硬着头皮自己把代码敲完!
#include<cstdio>
#include<iostream>
#define MOD 100000000
using namespace std;
int num[13],dp[13][150],state[150],n,m;
int tot,cnt;
bool judge(int x){return !(x&(x<<1));}
void init()
{
cnt=0;
tot=(1<<m);
for(int i=0;i<tot;i++)
if(judge(i))state[++cnt]=i;
}
bool fit(int x,int k){ return !(x&num[k]);}
int main()
{
int i,j,k,u;
while(~scanf("%d%d",&n,&m))
{
init();
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
num[i]=0;
for(j=1;j<=m;j++)
{
scanf("%d",&u);
if(u==0)num[i]+=(1<<m-j);
}
}
for(i=1;i<=cnt;i++)if(fit(state[i],1))dp[1][i]=1;
for(i=2;i<=n;i++)
{
for(j=1;j<=cnt;j++)
{
if(!fit(state[j],i))continue;
for(k=1;k<=cnt;k++)
{
if(!fit(state[k],i-1))continue;
if(state[k]&state[j])continue;
dp[i][j]=(dp[i][j]+dp[i-1][k])%MOD;
}
}
}
int ans=0;
for(i=1;i<=cnt;i++)ans=(ans+dp[n][i])%MOD;
cout<<ans<<endl;
}
return 0;
}