标签:
一道状态压缩的题,而我却错了好多次....应该先把满足的情况预处理出来
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int fitnum,n,m; int maps[20],state[1<<12]; int dp[20][1<<12]; #define mod 1000000000 int main() { while(~scanf("%d%d",&n,&m)) { memset(maps,0,sizeof(maps)); fitnum = 0; for(int i = 1;i <= n;i++) { for(int j = 1;j <= m;j++) { int s; scanf("%d",&s); if(!s) maps[i] += 1<<(m-j); } } memset(dp,0,sizeof(dp)); memset(state,0,sizeof(state)); for(int i = 0;i < (1<<m);i++) { if((i&(i<<1)) == 0) state[fitnum++] = i; } for(int i = 0;i < fitnum;i++) { if(!(state[i] & maps[1])) dp[1][i] = 1; } for(int i = 2;i <= n;i++) { for(int k = 0;k < fitnum;k++) { if(state[k] & maps[i]) continue; for(int j = 0;j < fitnum;j++) { if(state[j] & maps[i-1]) continue; if(state[j] & state[k]) continue; dp[i][k] = (dp[i][k]%mod + dp[i-1][j]%mod)%mod; } } } int ans = 0; for(int i = 0;i < fitnum;i++) { ans = (ans%mod + dp[n][i]%mod) % mod; } printf("%d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/jifahu/p/5449246.html