第一道状态压缩DP。。。。入门题 按照自己的思路来 AC了
先把每行可行的状态求出来 再进行DP
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int mod=100000000;
int dp[13][5000], map[13][13], state[13][1005], len[13];
int main()
{
int n, m, i, j, k;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&map[i][j]);
for(i=0;i<n;i++)
len[i]=1, state[i][0]=0;
int tmp;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
tmp=len[i];
for(k=0;k<len[i];k++)
{
if((j==0||!(1<<(j-1)&state[i][k]))&&map[i][j])
{
state[i][tmp++]=state[i][k]|(1<<j);
}
}
len[i]=tmp;
}
}
memset(dp,0,sizeof(dp));
int s1, s2;
for(i=0;i<len[0];i++)
{
dp[0][state[0][i]]=1;
}
for(i=1;i<n;i++)
{
for(j=0;j<len[i];j++)
{
s1=state[i][j];
for(k=0;k<len[i-1];k++)
{
s2=state[i-1][k];
if(!(s1&s2))
{
dp[i][s1]=(dp[i][s1]+dp[i-1][s2])%mod;
}
}
}
}
int ans=0;
for(i=0;i<len[n-1];i++)
{
s1=state[n-1][i];
ans=(ans+dp[n-1][s1])%mod;
}
printf("%d\n",ans);
}
return 0;
}