poj 3254
Corn Fields
#include <stdio.h>
#include <cstring>
#include <iostream>
using namespace std;
#define mod 100000000
int n,m,top=0;
int status[1000];
int dp[20][1000];
int cur[20];
void init(int s)
{
top=0;
for (int i = 0; i < 1<<m; ++i)
{
if(i&i<<1 || i&cur[s]) continue;
status[top++]=i;
}
}
int main(int argc, char const *argv[])
{
// freopen("input","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF)
{
top=0;
memset(cur,false,sizeof(cur));
memset(dp,false,sizeof(dp));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int a;
scanf("%d",&a);
if(a==0)
cur[i]+=1<<(m-j-1);
}
// cout<<cur[i]<<" ";
}
init(0);
int st[1000];
int t=top;
memcpy(st,status,sizeof(status));
for(int i=0;i<t;i++)
dp[0][i]=1;
for(int i=1;i<n;i++)
{
init(i);
for(int j=0;j<top;j++)
{
for(int v=0;v<t;v++)
{
// cout<<status[j]<<" ";
// cout<<st[v]<<endl;
if(status[j]&st[v]) continue;
dp[i][j]+=dp[i-1][v];
}
// cout<<i<<" "<<j<<" "<<dp[i][j]<<endl;
}
t=top;
memcpy(st,status,sizeof(status));
}
int sum=0;
for(int i=0;i<top;i++)
sum+=dp[n-1][i];
printf("%d\n",sum%100000000);
}
return 0;
}