状态压缩基础题目,注意取模,水水就过了
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n,m;
int map[15];
int dp[15][1000];
int status[1000];
int cnt=0;
bool ok(int i)
{
if (i&(i<<1))
return false;
return true;
}
void init()
{
cnt=0;
for (int i=0;i<(1<<13);i++)
{
if (ok(i))
{
cnt++;
status[cnt]=i;
}
}
}
int main()
{
init();
while (cin>>n>>m)
{
memset(map,0,sizeof(map));
memset(dp,0,sizeof(dp));
for (int i=1;i<=n;i++)
{
for (int t=0;t<m;t++)
{
int p;
cin>>p;
if (p==0)
map[i]|=(1<<t);
}
}
int mm=0;
for (int i=1;i<=cnt;i++)
{
if (status[i]>=(1<<m))
break;
mm++;
}
for (int i=1;i<=mm;i++)
{
if (status[i]&map[1])
continue;
dp[1][i]=1;
}
for (int i=2;i<=n;i++)
{
for (int t=1;t<=mm;t++)
{
for (int k=1;k<=mm;k++)
{
if (status[k]&map[i])
continue;
if (status[t]&status[k])
continue;
dp[i][k]+=dp[i-1][t];
dp[i][k]%=100000000;
}
}
}
int ans=0;
for (int i=1;i<=mm;i++)
if (dp[n][i]!=-1)
ans=(ans+dp[n][i])%100000000;
cout<<ans<<endl;
}
}