zoukankan      html  css  js  c++  java
  • 玉米田

    f[i][j]表示第i行状态为j时的方案数。

    pd[i]用于判断第i行的一种方法是否合法。

    f[i][j]=f[i-1][k],j&k==0,j&pd[i]==0,k&pd[i-1]==0

    由于每行两两不相邻,所以可以预处理。

    蒟蒻的第一道状压。

    看代码:

    #include<stdio.h>
    #include<iostream>
    using namespace std;
    #define mod 100000000
    int n,m,ans;
    int a[20][20],s[20],q[200],cnt;
    int f[20][50000],pd[20];
    void dfs(int pos){
        if(pos==m+1){
            cnt++;
            for(int i=1;i<=m;i++)
                q[cnt]=q[cnt]*2+s[i];
            return;
        }
        s[pos]=0;
        dfs(pos+1);
        if(s[pos-1]==0){
            s[pos]=1;
            dfs(pos+1);
        }
    }
    int main(){
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++){
                scanf("%d",&a[i][j]);
                pd[i]=pd[i]*2+1-a[i][j];
            }
        //for(int i=1;i<=n;i++)
        //    printf("%d
    ",pd[i]);
        dfs(1);
        //for(int i=1;i<=cnt;i++)
        //    printf("%d
    ",q[i]);
        //cout<<cnt<<endl;
        f[0][0]=1;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=cnt;j++)
                if((pd[i]&q[j])==0)
                    for(int k=1;k<=cnt;k++)
                        if((pd[i-1]&q[k])==0&&(q[j]&q[k])==0)
                            f[i][q[j]]=(f[i][q[j]]+f[i-1][q[k]])%mod;
        //for(int i=1;i<=n;i++)
        //    for(int j=1;j<=cnt;j++)
        //        printf("%d %d %d
    ",i,q[j],f[i][q[j]]);
        for(int i=1;i<=cnt;i++)
            if((q[i]&pd[n])==0)ans=(ans+f[n][q[i]])%mod;
        printf("%d
    ",ans);
        return 0;
    }

    深深地感到自己的弱小。

  • 相关阅读:
    eclipse部署
    jsp—eclipse配置
    虚拟路径和虚拟主机
    tomcat配置
    初来乍到K
    【转】https://和http://区别
    【转】编码格式
    【转】如何使用瑞萨E10A调试SH系列不带片内FLASH的单片机
    【转】UML
    软考_系统架构师
  • 原文地址:https://www.cnblogs.com/syzf2222/p/12405094.html
Copyright © 2011-2022 走看看