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;
	}
}


原文地址:https://www.cnblogs.com/james1207/p/3331432.html