zoukankan      html  css  js  c++  java
  • 状压dp

    洛谷1879(大概算板子题叭。。

    看数据范围应该是状压dp,通过二进制01表示状态。

    #include <iostream>
    using namespace std;
    const int maxn=100000000;
    int state[13],dp[13][(1<<12)+3];
    bool jdg[(1<<12)+3];
    
    int main(){
        int m,n,x;
        cin>>m>>n;
        for(int i=1;i<=m;++i){
            for(int j=1;j<=n;++j){
                cin>>x;
                state[i]=(state[i]<<1)+x;//state[i]表示第i行的草地情况
            }
        }
        int max_state=1<<n;//最大状态
                           //从0~max_state-1这些状态里找合法状态
        for(int i=0;i<max_state;++i){  //同一行不相邻
            if((i&(i<<1))==0){   //左移右移选一个即可
                jdg[i]=true;
            }
        }
        dp[0][0]=1;//初始化,可以保证真正第一行状态的正确性
        for(int i=1;i<=m;++i){//第i行
            for(int j=0;j<max_state;++j){//状态为j
                if(jdg[j]&&((j&state[i])==j)){   //同一行不相邻&&草没种在贫瘠的地方
                    for(int k=0;k<max_state;++k){ //枚举上一行的状态
                        if((j&k)==0){        //同一列不相邻
                            dp[i][j]+=dp[i-1][k];
                            dp[i][j]%=maxn;
                        }
                    }
                }
            }
        }
        int ans=0;
        for(int i=0;i<max_state;++i){//把最后一行都加起来即可
            ans+=dp[m][i];
            ans%=maxn;
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    仙人球的残影
    Calculate the formula
    自定义代码段
    getter-setter方法练习
    封装
    Xcode文档安装
    Xcode模板修改
    匿名对象
    OC多文件开发介绍
    #pragma mark指令
  • 原文地址:https://www.cnblogs.com/Maxx-el/p/13404214.html
Copyright © 2011-2022 走看看