poj 3254 Corn Fields 状压dp
#include <cstdio> #include <cstring> using namespace std; #define mod 100000000 int M,N,top=0; int cur[20],dp[20][600]; int state[600],num[110]; bool ok(int x) { if(x&x<<1) return 0; return 1; } bool fit(int x,int k) { if(x&cur[k]) return 0; return 1; } void init() { top=0; int tot=1<<N; for(int i=0;i<tot;i++) if(ok(i)) state[++top]=i; } int main() { while(scanf("%d%d",&M,&N)!=EOF) { init(); memset(dp,0,sizeof(dp)); int i,j; for(int i=1;i<=M;i++) { cur[i]=0; int num; for(int j=1;j<=N;j++) { scanf("%d",&num); if(num==0) cur[i]+=(1<<(N-j)); } } for(int i=1;i<=top;i++) if(fit(state[i],1)) dp[1][i]=1; for(int i=2;i<=M;i++) { for(int k=1;k<=top;k++) { if(!fit(state[k],i)) continue; for(int j=1;j<=top;j++) { if(!fit(state[j],i-1)) continue; if(state[k]&state[j]) continue; dp[i][k]=(dp[i][k]+dp[i-1][j])%mod; } } } int ans=0; for(int i=1;i<=top;i++) ans=(ans+dp[M][i])%mod; printf("%d\n",ans); } return 0; }