327. 玉米田
题意:
m * n的土地,有的土地不育,有的可以种植,要求相邻的土地不能同时种植玉米,问有多少种种植方式
题解:
状压dp,先存每一行可能的状态,然后状态转移,注意相邻不能同时种植除了左右还有上下
代码:
#include <bits/stdc++.h>
using namespace std;
const int P=1e9;
int a[15][15],f[15],h[5010],dp[15][5010],ans;
int main(){int n,m;cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>a[i][j];f[i]=(f[i]<<1)+a[i][j];}dp[0][0]=1;for(int i=0;i<(1<<m);i++)h[i]=((i&(i<<1))==0)&&((i&(i>>1))==0);for(int i=1;i<=n;i++)for(int j=0;j<(1<<m);j++)if(h[j]&&((f[i]&j)==j))for(int k=0;k<(1<<m);k++)if((j&k)==0)dp[i][j]=(dp[i][j]+dp[i-1][k])%P;for(int i=0;i<(1<<m);i++)ans=(ans+dp[n][i])%P;cout<<ans;return 0;
}