題目大意:
給出一個M*N的矩陣,元素爲0表示這個地方不能種玉米,爲1表示這個地方能種玉米,現在規定所種的玉米不能相鄰,即每行或者沒列不能有相鄰的玉米,問一共有多少種種植方法。
思路狀態DP:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
int d[13][8192],p[8192],s[8192];//數組定大定小都會w掉
bool lily1(int x){
return (x&(x<<1));//判斷可行
}
bool lily2(int i,int x){
return (p[i]&s[x]);//當前方法能和當行匹配
}
int main(){
int i,j,k,a,u,n,m,ans=0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
scanf("%d",&a); //讀入
if(a==0)p[i]+=1<<(j-1);//取反
}
k=0;
for(i=0;i<(1<<m);i++){//判斷
if(!lily1(i)){
s[k++]=i;
}
}
for(i=0;i<k;i++){//登記
if(!lily2(1,i)){d[1][i]=1;}
}
for(i=2;i<=n;i++){
for(j=0;j<k;j++){
if(lily2(i,j))continue;
for(u=0;u<k;u++){
if(lily2(i-1,u))continue;
if(!(s[j]&s[u])) {//統計
d[i][j]+=d[i-1][u];
}
}
}
}
for(i=0;i<k;i++){//統計
ans+=d[n][i];
ans%=100000000;
}
printf("%d\n",ans);//輸出
}