题目: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;
}
}