#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e6;
const int mod=1e9;
int dp[15][(1<<11)+100];//空间可优化至dp[2][];dp[r][j]:至r行j状态的方案数
int mp[15][15];
int n,m;
int a[maxn];
int mp_jud(int r,int st)
{
for(int i=m-1;i>=0;i--,st=st>>1) if(!mp[r][i]&&(st&1)) return 0;
return 1;
}
int st_jud(int st)
{
while(st)
{
if((st&1)&&((st>>1)&1)) return 0;
st=st>>1;
}
return 1;
}
void init() //可用来优化时间
{
int num=0;
for(int i=0;i<(1<<11);i++)
{
if(st_jud(i)) a[num++]=i;
}
}
int two_jud(int st1,int st2)
{
while(st1&&st2)
{
if((st1&1)&&(st2&1)) return 0;
st1=st1>>1;
st2=st2>>1;
}
return 1;//忘记bug
}
int solve()
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++) //与从0行读入数据不符bug
{
for(int j=0;j<(1<<m);j++)
{
if(st_jud(j)&&mp_jud(i,j))
{
if(i==1) dp[i][j]++;
else
{
for(int k=0;k<(1<<m);k++)
{
if(st_jud(k)&&mp_jud(i-1,k)&&two_jud(k,j))
{
dp[i][j]=(dp[i][j]+dp[i-1][k]%mod)%mod;
}
}
}
}
}
}
int ans=0;
for(int i=0;i<(1<<m);i++) ans=(ans+dp[n][i])%mod;//方法总数为之和bug
return ans;
}
int main()
{
//freopen("C:/Users/hzy/Desktop/11.txt","r",stdin);
//init();
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++) //从0行读入bug
for(int j=0;j<m;j++)
scanf("%d",&mp[i][j]);
cout<<solve()<<endl;
}
return 0;
}//炮兵阵地poj 1185的简化版,第r行的状态只影响r-1行,时间也不用优化.
状压dp
最新推荐文章于 2022-12-28 19:41:41 发布