解题方法
状压dp,先dfs预处理出状态,然后一行一行地转移
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long s[1<<13];
long long tot=0;
long long ys[1<<13];
long long m,n;
const long long mod=100000000;
void dfs(long long he,long long sum,long long wei)
{
if(wei>=n)
{
tot++;
s[tot]=sum;
ys[tot]=he;
// cout<<he<<endl;
return;
}
dfs(he,sum,wei+1);
dfs(he+(1<<wei),sum+1,wei+2);
}
long long a[20];
long long dp[20][1<<13];
int main()
{
scanf("%lld%lld",&m,&n);
dfs(0,0,0);
for(long long i=1;i<=m;i++)
{
for(long long j=1;j<=n;j++)
{
long long x;
scanf("%lld",&x);
a[i]=a[i]<<1;
if(x==0)a[i]+=1;
}
// cout<<a[i]<<'\n';
}
memset(dp,0,sizeof(dp));
for(long long i=1;i<=tot;i++)
if(!(a[1]&ys[i]))
dp[1][i]=1;
for(long long i=2;i<=m;i++)
for(long long j=1;j<=tot;j++)
if(!(a[i]&ys[j])){
for(long long k=1;k<=tot;k++)
if(!(ys[j]&ys[k]))
dp[i][j]=(dp[i][j]+dp[i-1][k])%mod;}
long long ans=0;
for(long long i=1;i<=tot;i++)
ans=(ans+dp[m][i])%mod;
cout<<ans<<'\n';
return 0;
}