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);//輸出
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章