状态压缩DP入门题
.
/*本题为状态压缩题
题目大意 :
一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,
可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方
格不能同时放牛(不包括斜着的),即牛与牛不能相邻。问有多少种放牛方
案(一头牛都不放也是一种方案);
要枚举每一行中的是否种植(也就是0 1状态) 最大状态的12,
每一行的总共可以有的种植方式就有2^12次方种,
而二进制的0 1 特征刚好可以表示这些种植方式;
比如0001 表示在第四个位置种植,其他不种;
比如0101 表示2 4种,依此类推。。。
所以dp[n][m]的第二维度的大小,就要根据题目中的最大限度,
本题n,m的大小开到了12;所以我们以13为上限,或者2^12+10都可以;
dp[n][1<<13];
*/
#include<cstdio>
#include<string.h>
using namespace std;
const int mod=1e8;
const int maxn=<<;
int a[maxn];
int dp[][maxn];
int mp[];
int judge1(int x) //判断同一行中是否会出现相邻为1的情况。
{
return (x&(x<<));
}
int judge2(int i,int x) //判断此情况是否是题目中的可列举情况;
{ //因为题目中有限制哪些地方可以种植,哪些不可以;
return (mp[i]&a[x]);
}
void init() //初始化
{
memset(dp,,sizeof(dp));
memset(mp,,sizeof(mp));
memset(a,,sizeof(a));
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
init();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
int t;
scanf("%d",&t);
if(t==)
mp[i]+=<<(j-); //将题目中每一行的限制情况存储起来;
//这里存储的是不可种植的地方
//后面的判断某种种植方式是否可行的方案
//就可以通过mp[i]&a[x]来解决;
//比如题目中限制了0 1 0 1,表示只有2 4可种植
//而这里是存储了1 0 1 0,现在有个方案是0 1 0 0
//将其与1 0 1 0进行&运行,假如等于0,就表示可行;
}
int cot=;
for(int i=;i<(<<m);i++){
if(!judge1(i))
a[cot++]=i; //将第一行可表示的状态(没有相邻1)列举出来
//此时还未与题目中的限制的可种植地方相比较;
}
for(int i=;i<cot;i++) //与题目限制的相比较;
if(!judge2(,i)) //如果方案可行,=1;
dp[][i]=;
for(int i=;i<=n;i++){
for(int j=;j<cot;j++){
if(judge2(i,j)) //如果不满足限制的种植条件
continue;
for(int k=;k<cot;k++){
if(judge2(i-,k)) //如果不满足限制的种植条件
continue;
if(!(a[k]&a[j]))
dp[i][j]+=dp[i-][k];
}
}
}
int ans=;
for(int i=;i<cot;i++){
ans+=dp[n][i]; //将所有方案相加;
ans%=mod;
}
printf("%d\n",ans);
}
return ;
}
状态压缩DP入门题的更多相关文章
- Hdu-1565 方格取数(1) (状态压缩dp入门题
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- POJ Corn Fields 状态压缩DP基础题
题目链接:http://poj.org/problem?id=3254 题目大意(名称什么的可能不一样,不过表达的意思还是一样的): 种玉米 王小二从小学一年级到现在每次考试都是班级倒数第一名,他的爸 ...
- 状态压缩dp入门
poj1321 http://poj.org/problem?id=1321 我们可以把棋盘的每一行看做是一个状态,如果某一列放置了棋子,那么就标记为1,否则就标记为0.然后把它看成是一个二进制数,然 ...
- POJ3254Corn Fields(状态压缩DP入门)
题目链接 题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻.问有多少种放牛方案(一 ...
- 状态压缩dp第一题
标签: ACM 题目: Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; ...
- 状态压缩---状态压缩dp第一题
标签: ACM 题目: Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; ...
- poj - 3254 Corn Fields (状态压缩dp入门)
http://poj.org/problem?id=3254 参考:http://blog.csdn.net/accry/article/details/6607703 农夫想在m*n的土地上种玉米, ...
- 状态压缩dp 入门
1.有一张n*m (n<=m)的棋盘,在上面放n个中国象棋里的车,使得任意两个车不能相互攻击,总共有多少种不同的方案. 2.有一张n*m (n<=m)的棋盘,其中有些格子里面不能放,在上面 ...
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
随机推荐
- 双向链表的简单Java实现-sunziren
写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起. 在上次分享完单向链表的简单编 ...
- dev 控件用法2 之repositoryItemSearchLookUpEdit
repositoryItemSearchLookUpEdit var y = userinfo.Select.ToList( a => new { userid = a.userid, code ...
- ElementUI的el-table的多选的取消选择和筛选的取消所有过滤器之ref冲突问题
写此文的缘由:现如今,网络上,没有同下的解释形式(或者在外网,所以我没找到,或者大佬觉得太简单所以不屑解释).然而,我认为这是对VUE+ElementUI的底层框架的理解深入化问题.(为什么要深入理解 ...
- Trie树相关博客
1. c++代码实现,包含删除操作:https://www.cnblogs.com/luxiaoxun/archive/2012/09/03/2668611.html 2. 一种典型实现及简单分析:h ...
- 记录 Docker 的学习过程 (数据挂载)
docker 存储篇 容器中的存储是分层的, 在容器中,如果我们要创建一个文件,会在文件的最上层(可写层)创建 容器中内置的文件,默认来讲是只读的,只有自己创建的文件才是可写状态 比如说 /etc/p ...
- Oracle - 拼接多个字段 - wm_concat()函数
Oracle wm_concat()函数oracle wm_concat(column)函数使我们经常会使用到的,下面就教您如何使用oraclewm_concat(column)函数实现字段合并如:s ...
- python3练习100题——030
这周开始,要重新振作一点吧! 如果每天都想着消费升级,而不是想着如何投入时间精力让自己进步,未来根本就看不到希望. 我想要更认真的活着 live wild 原题链接:http://www.runoob ...
- 腾讯云OCR图片文字识别
一. OCR OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别 ...
- Ubuntu 安装交叉编译器出错问题
安装教程网上有很多,可参考:Ubuntu14.04(64位)下gcc-linaro-arm-linux-gnueabihf交叉编译环境搭建 但是我的问题一直是路径搭好了,就是找不到文件:反复查找,花了 ...
- Chrome 提标 您的浏览器限制了第三方Cookie...解决方法
最近升级Chrome后会出现 您的浏览器限制了第三方Cookie,这将影响您正常登录,您可以更改浏览器的隐私设置,解除限制后重试. 解决方法: chrome://flags/ 把这句复制到浏览器回车 ...