您的位置:首页 > 其它

POJ3254 Corn Fields(状态DP)

2016-06-14 10:41 204 查看
题目大意:

给出一个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
[i];
ans%=100000000;
}

printf("%d\n",ans);//输出
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj dp