状态dp,记录上一行推当前行
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
#define mod 100000000
int n,m;
vector<int>ok;
vector<int>suit[13];
int dp[13][400];
int map[13][13];
inline void init()
{
ok.clear();
for(int i=0;i<(1<<m);i++)
{
if(i&(i<<1)) continue;
if(i&(i>>1)) continue;
ok.push_back(i);
}
for(int i=0;i<n;i++)
{ suit[i].clear();
for(int j=0;j<ok.size();j++)
{
int tag=1;
for(int k=0;k<m;k++)
{
if(map[i][k]==0&&(ok[j]&(1<<k)))
{
tag=0;break;
}
}
if(tag)
suit[i].push_back(ok[j]);
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&map[i][j]);
init();
//printf("%d\n",ok.size());
memset(dp,0,sizeof(dp));
for(int i=0;i<suit[0].size();i++)
{
dp[0][i]=1;
}
for(int i=1;i<n;i++)
{
for(int j=0;j<suit[i].size();j++)
{
int now=suit[i][j];
for(int k=0;k<suit[i-1].size();k++)
{
if(now&(suit[i-1][k])) continue;
dp[i][j]+=dp[i-1][k];
dp[i][j]%=mod;
}
}
}
int ans=0;
for(int i=0;i<suit[n-1].size();i++)
{
ans+=dp[n-1][i];
ans%=mod;
}
printf("%d\n",ans);
}
return 0;
}