POJ3254 Corn Fields (状态压缩DP)
2015-11-17 21:36
465 查看
题目点我点我点我
题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法。
思路:利用一个state数组记录所有可行状态的情况,将输入的每一行数取二进制的相反数,与state的可行状态相匹配,每一种匹配的状况再与前一行状况匹配,dp[i][j]代表第i行的第j种状态,记录第i行的第j种状态的方案数,利用层层递推,最后将最后一行所有状态方案数相加即为答案。
题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法。
思路:利用一个state数组记录所有可行状态的情况,将输入的每一行数取二进制的相反数,与state的可行状态相匹配,每一种匹配的状况再与前一行状况匹配,dp[i][j]代表第i行的第j种状态,记录第i行的第j种状态的方案数,利用层层递推,最后将最后一行所有状态方案数相加即为答案。
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> using namespace std; #define mod 100000000 #define maxn 145 //最多12行12列,12*12种状态 int M,N,top; //top每一行最多的状态数 int cur[13]; //记录每一行的输入 int state[maxn]; //记录每一行的状态 int dp[13][maxn]; bool ok(int x) { if(x&(x<<1))return false; else return true; } void init() //初始化 { top=0; for(int i=0;i<(1<<N);i++) { if(ok(i))state[++top]=i; } } int fit(int a,int b) //判断状态a与b行逆状态是否有同一列都为1 { if(a&cur[b]) return 0; else return 1; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(~scanf("%d%d",&M,&N)) { init(); int num; memset(dp,0,sizeof(dp)); for(int i=1;i<=M;i++) { for(int j=1;j<=N;j++) { scanf("%d",&num); if(num==0) cur[i]+=(1<<(N-j)); } } for(int i=1;i<=top;i++) { if(fit(state[i],1)) dp[1][i]=1; } for(int i=2;i<=M;i++) { for(int j=1;j<=top;j++) //找出与第i行符合的状态 { if(!fit(state[j],i))continue; for(int k=1;k<=top;k++) //找出能与第i-1符合的状态 { if(!fit(state[k],i-1))continue; if(state[k]&state[j])continue; //判断是否与第i行冲突 dp[i][j]=(dp[i][j]+dp[i-1][k])%mod; } } } int ans=0; for(int i=0;i<=top;i++) { ans=(ans+dp[M][i])%mod; //累加最后一行所有可能状态的值,即得最终结果 } printf("%d\n",ans); } return 0; }
相关文章推荐
- Object-c之正则表达式之一
- 227 Entering Passive Mode (xxx,xxx,,xxx,xxx,x)
- Kafka详解二、如何配置Kafka集群
- Swift中枚举enum讲解
- 参加Autodesk 2015 开发者大会:物联网有意思的试验
- valueForkeyPath方法使用
- 「喵神成长史」『布局篇』GridLayout(网格布局)
- HDOJ 1075 What Are You Talking About (字典树映射)
- 360护心镜:XSS攻击与前端主动防御解决方案
- keil c51 编程
- 浅谈swift的字符串的常用方法
- hdoj 5124 lines【线段树+离散化】
- 淘宝下单高并发解决方案
- 大神养成计划第二天 --南大软院大神养成计划
- hdu 3664 dp
- iOS9使用提示框的正确实现方式
- Linux 磁盘分区、格式化、挂载、查看操作
- 30大恐怖游戏
- 白鹭引擎(Egret Engine )
- UITableView的使用