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;

	}

}


 

 

你可能感兴趣的:(Field)