#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;
int m,n;
int ok[4100];//2^12
int dp[13][4100]={0};
int ma[13];//原地图
int num=0;
int temp;
int judge(int s,int mapp)
{
if(s&mapp) return 1;
else return 0;
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++)
{
num=0;
for(int j=1;j<=n;j++)
{
scanf("%d",&temp);
if(temp==0) num=num+(1<<(n-j));
}
ma[i]=num;//第i行的地图
}
for(int state=0;state<(1<<n);state++)
{
if((state&(state<<1))==0) ok[state]=1;
else ok[state]=-1;
}
for(int state=0;state<(1<<n);state++)
{
if(judge(state,ma[1])==1) continue;
if(ok[state]==1)
{
dp[1][state]=1;
}
else dp[1][state]=0;
//printf("dp[%d][%d]==%d ",1,state,dp[1][state]);
}
//cout<<endl;
for(int i=2;i<=m;i++)
{
for(int state=0;state<(1<<n);state++)
{
if(ok[state]==-1) continue;
else
{
if(judge(state,ma[i])==1) continue;
else
{
for(int t=0;t<(1<<n);t++)
{
if(ok[t]==-1) continue;
if(judge(t,ma[i-1])==1) continue;
if((t&state)>=1) continue;
dp[i][state]=(dp[i][state]+dp[i-1][t])%100000000;
}
}
}
// printf("dp[%d][%d]==%d ",i,state,dp[i][state]);
}
// cout<<endl;
}
int ans=0;
for(int i=0;i<(1<<n);i++)
{
ans=(ans+dp[m][i])%100000000;
}
printf("%d\n",ans);
}
return 0;
}
1.位运算 很重要啦
2.自己WA的原因:
1.注意!!!位运算优先级很低的,要打括号!!!
2.dp的思想。
当状态需要N维的时候我们可以用状态dp压缩 其实就是我们算的时候(位运算呀)是把他看做二进制,但是存起来的时候是十进制呢。
所以1.假设之前的都算好了,现在算现在的。这个是我对dp的理解= =
2.一定要注意边界条件,也就是最最最开始的时候要初始化,还有其他的。