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


  • 相关阅读:
    git connection due to public key issue
    ubuntu search and java write to file
    url
    sort by datetime
    work on ui
    PHP工厂方法模式
    PHP的简单工厂模式
    php如何判断数组是一维还是多维
    nginx搭建分布式简单配置
    python的单例模式
  • 原文地址:https://www.cnblogs.com/james1207/p/3331432.html
Copyright © 2020-2023  润新知