• Corn Fields


    首先什么都不填是一种,初值f[0][0]设为1

    然后有三种不合法的情况:

                                             1.不肥沃

                                             2.行冲突

                                             3.列冲突

    前两种可以预处理,最后计算时枚举上一行的状态,判断

    运算符的优先级要注意

    不断熟悉状压DP

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int M=1e8;
    const int maxn=13;
    const int maxm=4096;
    int a[maxn][maxn];
    int F[maxm],f[maxn][maxm];
    bool jd[maxm];
    int main(){
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>a[i][j];
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                F[i]=(F[i]<<1)|a[i][j];//肥沃 不肥沃
        int MAX=1<<m;
        for(int i=0;i<MAX;i++)
            jd[i]=((i&(i<<1))==0)&&((i&(i>>1))==0);//行内冲突 
        f[0][0]=1;//啥也不填先加上 
        for(int i=1;i<=n;i++)
            for(int j=0;j<MAX;j++)
                if(jd[j]&&((j&F[i])==j))
                    for(int k=0;k<MAX;k++)
                        if((k&j)==0)f[i][j]=(f[i][j]+f[i-1][k])%M;//列不冲突 
        int ans=0;
        for(int i=0;i<MAX;i++){
            ans+=f[n][i];
            ans%=M;
        }
        cout<<ans<<endl;
        return 0;
    } 
  • 相关阅读:
    16-高级指针
    15-C语言结构体
    14-C语言宏
    13-C语言字符串函数库
    12-C语言字符串
    11-C语言指针
    10-C语言函数
    POJ 1001 高精度乘法
    POJ 1060 多项式乘法和除法取余
    POJ 1318 字典排序
  • 原文地址:https://www.cnblogs.com/lcan/p/9405615.html
Copyright © 2020-2023  润新知