poj 3254 Corn Fields (状态压缩DP)
题目:http://poj.org/problem?id=3254
思路见代码:
#include<iostream> using namespace std; const int MOD=100000000; const int MAX_N_M=12; int row_state[MAX_N_M]; // 枚举出合法的状态数 int LegalState[2000],nstate; int dp[MAX_N_M][2000],n,m; /* dp[i][j]:= 第i行,状态为j时的方案数 */ void init() //枚举合法状态 { int allstate=0x1<<12; nstate=0; for(int i=0;i<allstate;i++) { if((i&(i<<1))==0){ LegalState[nstate++]=i; } } } int main() { while(cin>>m>>n) { init(); for(int i=0;i<m;i++) { row_state[i]=0; for(int j=n-1;j>=0;j--) { int s; cin>>s; row_state[i] += s<<j; //每行的状态 } } // 处理第1行的情况 // 合法状态与每一行的状态按位与 for(int i=0;i<nstate;i++) { dp[0][i]=((row_state[0]&LegalState[i]) == LegalState[i])?1:0; } for(int i=1; i<m; i++) { for(int j=0; j<nstate; j++) { if((row_state[i]&LegalState[j]) == LegalState[j]) { for(int k=0; k<nstate; k++) { if(dp[i-1][k] && (LegalState[k]&LegalState[j])==0) { dp[i][j] += dp[i-1][k]; dp[i][j] %=MOD; } } } } } int res=0; for(int i=0;i<nstate;i++) { res += dp[m-1][i]; res %= MOD; } cout<<res<<endl; } }