POJ3254 Corn Fields(状态DP)
2016-06-14 10:41
204 查看
题目大意:
给出一个M*N的矩阵,元素为0表示这个地方不能种玉米,为1表示这个地方能种玉米,现在规定所种的玉米不能相邻,即每行或者没列不能有相邻的玉米,问一共有多少种种植方法。
思路状态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 [i]; ans%=100000000; } printf("%d\n",ans);//输出 }
相关文章推荐
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android dpi,dip,dp的概念以及屏幕适配
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ 2159 Ancient Cipher
- POJ 2635 The Embarrassed Cryptographe