大致題意:有一塊地,然後,不對,這是中文題,不用說題意,還是說一下,不然這篇博客看起來就像是划水的博客一樣,就是選則一些爲1的區域去種草,不能在相鄰的區域種草,問種草的方案有多少種。很明顯的狀壓DP,首先預處理出每一行中 可以種草的情況,就是處理出那些草不相鄰的並且沒有在0上種草的合法情況。然後再對每一行的合法情況:去加上前一行的合法情況的種類,當然,要判斷能否從前一行轉移到當前行。
最後,代碼:
#include<bits/stdc++.h>
using namespace std;
int arr[15][15];
int dp[15][1<<14];
const int mod=1e9;
int F[15];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;++i)
{
int temp=0;
for(int j=0;j<m;++j)
{
cin>>arr[i][j];
if(arr[i][j]==0)
temp=temp+(1<<(m-j-1));
}
F[i]=temp;
}
for(int i=0;i<n;++i)
{
for(int j=0;j<(1<<m);++j)
{
bool flag=true;
if((j&(j<<1))||(j&(j>>1)))
flag=false;
for(int k=0;k<m;++k)
{
if(j&F[i])
flag=false;
}
if(flag)
dp[i][j]=1;
}
}
for(int i=1;i<n;++i)
{
for(int j=0;j<(1<<m);++j)
{
if(dp[i][j])
{
dp[i][j]=0;
for(int k=0;k<(1<<m);++k)
{
if(!(j&k))
dp[i][j]=(dp[i][j]+dp[i-1][k])%mod;
}
}
}
}
int ans=0;
for(int i=0;i<(1<<m);++i)
{
ans=(ans+dp[n-1][i])%mod;
}
cout<<ans<<endl;
return 0;
}