POJ3254 Corn Fields(状态DP)

题目大意:

给出一个M*N的矩阵,元素为0表示这个地方不能种玉米,为1表示这个地方能种玉米,现在规定所种的玉米不能相邻,即每行或者没列不能有相邻的玉米,问一共有多少种种植方法。

思路状态DP:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
int d[13][8192],p[8192],s[8192];//数组定大定小都会w掉
bool lily1(int x){
    return (x&(x<<1));//判断可行
}
bool lily2(int i,int x){
    return (p[i]&s[x]);//当前方法能和当行匹配
}
int main(){
    int i,j,k,a,u,n,m,ans=0;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
         for(j=1;j<=m;j++){
              scanf("%d",&a);   //读入
              if(a==0)p[i]+=1<<(j-1);//取反
         }
    k=0;
    for(i=0;i<(1<<m);i++){//判断
        if(!lily1(i)){
            s[k++]=i;
        }
    }
    for(i=0;i<k;i++){//登记
        if(!lily2(1,i)){d[1][i]=1;}
    }
    for(i=2;i<=n;i++){
        for(j=0;j<k;j++){
            if(lily2(i,j))continue;
            for(u=0;u<k;u++){
                if(lily2(i-1,u))continue;
                if(!(s[j]&s[u])) {//统计
                d[i][j]+=d[i-1][u];
            }
            }
        }
    }
    for(i=0;i<k;i++){//统计
        ans+=d[n][i];
        ans%=100000000;
    }

    printf("%d\n",ans);//输出
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章