Click Here
题意:有一个m*n的农场,1表示土地肥沃,可以种草,0表示土地贫瘠,不能种草,不能选择两块相邻的土地,问有几种种草方式
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mod=1e8,maxn=1<<12;
ll dp[20][maxn],h[20];
int main()
{
int n,m;
scanf("%d%d",&m,&n);
for(int i=1;i<=m;++i)
for(int j=0,p;j<n;++j)
{
scanf("%d",&p);
p=!p,h[i]=h[i]<<1|p;//保存不能种的地方
}
for(int i=0;i<=(1<<n)-1;++i)
{
if(i<<1&i||i&h[1])continue;//不能两个相邻
dp[1][i]=1;//赋初值
}
for(int i=2;i<=m;++i)//枚举行数
{
for(int j=0;j<=(1<<n)-1;++j)//枚举当前行的状态
{
if(j<<1&j||j&h[i])continue;//不能相邻
for(int k=0;k<=(1<<n)-1;++k)//枚举上一行状态
{
if(k<<1LL&k||k&j||k&h[i-1])continue;//没有冲突
dp[i][j]+=dp[i-1][k],dp[i][j]%=mod;//累加结果
}
}
}
ll ans=0;
for(int i=0;i<=(1<<n)-1;++i)
ans+=dp[m][i],ans%=mod;
printf("%lld\n",ans);
return 0;
}