[文章目录]
Description
Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地。FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用。遗憾的是,有些土地相当的贫瘠,不能用来放牧。并且,奶牛们喜欢独占一块草地的感觉,于是FJ不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边。当然,FJ还没有决定在哪些土地上种草。 作为一个好奇的农场主,FJ想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择。当然,把新的牧场荒废,不在任何土地上种草,也算一种方案。请你帮FJ算一下这个总方案数。
都有点不太会状压DP了。。。练手
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,col[30],sit[1000],tot,ans;
int dp[20][1<<14];
const int mod=100000000;
int main()
{
scanf("%d%d",&n,&m);
int x,i,j,s;
for(s=0;s<(1<<m);++s)
if(!(s&(s>>1))) sit[++tot]=s;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
{
scanf("%d",&x);
col[i]|=(x<<j-1);
}
dp[0][1]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=tot;j++)
if((sit[j]|col[i])==col[i])
{
for(s=1;s<=tot;s++)
if(!(sit[j]&sit[s]))
dp[i][j]=(dp[i][j]+dp[i-1][s])%mod;
}
}
for(i=1;i<=tot;++i) ans=(ans+dp[n][i])%mod;
printf("%d",ans);
return 0;
}