#include <iostream>
using namespace std;
#define mod 100000000
#define maxn (1<<12)+1
bool map[14][14];
int dp[2][maxn];
int n,m;
int son[maxn];
void dfs(int x,int k,int y,int& top,bool can[])
{
if(k>m)
{
son[top++]=y;
return;
}
else
{
if((x&(1<<(k-1))))
{
dfs(x,k+1,y,top,can);
}
else
{
if(can[m+1-k]&&(k==1||(!(y&(1<<(k-2))))))dfs(x,k+1,y+(1<<(k-1)),top,can);
dfs(x,k+1,y,top,can);
}
}
return;
}
int main()
{
int top;
for(;scanf("%d%d",&n,&m)==2;)
{
memset(map,false,sizeof(map));
memset(dp,0,sizeof(dp));
memset(son,-1,sizeof(son));
for(int i=1;i<n+1;i++)
for(int j=1;j<m+1;j++)
scanf("%d",&map[i][j]);
for(int i=0;i<n;i++)
{
if(i==0)
{
top=0;
dfs(0,1,0,top,map[1]);
for(int j=0;j<top;j++)
{
dp[1][son[j]]++;
while(dp[1][son[j]]>=mod)dp[1][son[j]]-=mod;
}
}
else
{
memcpy(dp[0],dp[1],sizeof(dp[0]));
memset(dp[1],0,sizeof(dp[1]));
for(int j=0;j<(1<<(m));j++)
{
top=0;
dfs(j,1,0,top,map[i+1]);
for(int k=0;k<top;k++)
{
dp[1][son[k]]=dp[0][j]+ dp[1][son[k]];
while(dp[1][son[k]]>=mod)dp[1][son[k]]-=mod;
}
}
}
}
int sum=0;
for(int j=0;j<(1<<(m));j++)
{
sum+=dp[1][j];
while(sum>=mod)sum-=mod;
}
printf("%d\n",sum);
}
return 0;
}
poj3254
最新推荐文章于 2018-11-02 11:52:13 发布