二:状压dp
一:状压dp的基本特征
状态压缩问题一般是指用十进制的数来表示二进制下的状态
这种用一个数来表示一组数,以降低表示状态所需的维数的解题手段,就叫做状态压缩。
常用到位运算
二:位运算
&:与运算,相同为1不同为0
| :或运算,全0位0,否则为1
^:异或运算,不同为1,相同为0(也叫半加与运算)
<<:左移操作,x<<j,x在二进制下向左移j位,(也就是原来的数乘j即:x*=j)右边用0填充,反码不同,要用1填充(负数)
>>:右移操作,x>>j相当于x=/j,左边反码,补码补1(负数)
例:
1.判断一个数字x在二进制下的第i位是不是为1if(((1<<(i-1))&x)>0)
将1左移i-1位,相当于制造了一个只有第i位为1其他位都是0的二进制数,然后用该数与x做与运算
2.把一个数字x在二进制下的第x为更改为1
x|=(1<<(i-1))

eg:
有一个n*m的棋盘(1<=n<=5,1<=m<=1000)现有1*2和2*1的小木块无数
要想盖满整个棋盘有多少种方法,答案大于1000000007,mod1000000007。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int N, M; //n,m分别代表棋盘的长宽
][]; //dp[i][j]表示对于前i-1行,第i行采用第j(一个十进制的数)种状态时,得到的方案可行的总数
void dfs(int i,int j,int state,int nex) //这里i代表列数,j代表当前位数(也可以说是行数-1,初始时为0),state代表状态数,nex代表下一列出现的状态
{
if (j==N) //用if判断每种情况都尝试去做,而不用if...else判断
{
dp[i+][nex]+=dp[i][state];
return;
}
<<j)&state)>)
dfs(i,j+,state,nex); //如果这个位置已经被上一列所占用,直接跳过
<<j)&state)==)
dfs(i,j+,state,nex|(<<j)); //如果这个位置是空的,尝试放一个左右覆盖1*2的木板
<N && ((<<j)&state)== && ((<<(j+))&state)==)
dfs(i,j+,state,nex); //如果这个位置以及下一个位置都是空的,尝试放一个上下覆盖2*1的木板,而此时要跳过下一个木块
return;
}
int main()
{
while (cin>>N>>M)
{
memset(dp,,sizeof(dp));
dp[][]=; //初始化第一列状态为0的方法数等于1
;i<=M;i++) //外层for循环遍历每一列
{
;j<(<<N);j++) //内层for遍历每一个列的所有状态
if (dp[i][j]) //只要dp[i][j]方法数不为空,就执行dfs方法
{
dfs(i,,j,);
}
}
cout<<dp[M+][]<<endl; //最后dp[m+1][0]就是结果
}
}
https://blog.csdn.net/harrypoirot/article/details/23163485
一个大佬讲的状压dp
二:状压dp的更多相关文章
- 状压dp之二之三 炮兵阵地/玉米田 By cellur925
一.简单的状压dp 玉米田 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ ...
- kuangbin专题十二 HDU1074 Doing Homework (状压dp)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP
[BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...
- 【状压DP】bzoj1087 互不侵犯king
一.题目 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上.下.左.右,以及左上.左下.右上.右下八个方向上附近的各一个格子,共8个格子. I ...
- 2014 Super Training #1 B Fix 状压DP
原题: HDU 3362 http://acm.hdu.edu.cn/showproblem.php?pid=3362 开始准备贪心搞,结果发现太难了,一直都没做出来.后来才知道要用状压DP. 题意: ...
- UVa 11825 (状压DP) Hackers' Crackdown
这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...
- HDU5731 Solid Dominoes Tilings 状压dp+状压容斥
题意:给定n,m的矩阵,就是求稳定的骨牌完美覆盖,也就是相邻的两行或者两列都至少有一个骨牌 分析:第一步: 如果是单单求骨牌完美覆盖,请先去学基础的插头dp(其实也是基础的状压dp)骨牌覆盖 hiho ...
随机推荐
- 怎样在linux下对U盘进行格式化和分区
说明,为了不做无用功,首先必须卸载要分区的设备,分区才能执行成功.通过命令umount /media/?? 或者umount /mnt/??? 看你的实际情况,这一步必不可少.1.首先通过命令fdis ...
- Vue学习笔记之vue-cli脚手架项目中组件的使用
在webpack-simple模板中,包括webpck模板.一个.vue文件就是一个组件. 为什么会这样呢?因为webpack干活了!webpack的将我们所有的资源文件进行打包.同时webpack还 ...
- 一个简单清晰的Redis操作类-php
<?php /** * redis处理的二次封装 * */ class Redis{ private $_redis; private $_config; public function __c ...
- 20145118 《Java程序设计》第1周学习总结
20145118 <Java程序设计>第1周学习总结 教材学习内容总结 由于寒假在家已经安装了java开发工具,所以安装过程在这里不再赘述.这一周我开始了Java初学阶段,从Java的历史 ...
- [问题解决]不使用PWM调速系统,彻底解决一个L298N带动两个电机却转速不同的问题
问题描述:由单片机的VCC引脚供电,使用L298N控制两个电机,发现左右两个轮子的转速老是不一样,更多的情况是左轮转速高(左轮电机接OUT1和OUT2),右轮转速低(右轮电机接OUT3和OUT4)甚至 ...
- Python学习札记(四十二) IO 2
参考:StringIO和BytesIO NOTE 1.StringIO: 顾名思义就是在内存中读写str. #!/usr/bin/env python from io import BytesIO a ...
- 使用javascript模拟常见数据结构(一)
数据结构和算法可算是每个程序员的必备技能,而随着前端工作的深入,对于数据结构的知识真的是越来越需要掌握了.好了,于是乎最近看了<javascript数据结构和算法>,算是对于后面的使用C语 ...
- vim 安装vim-airline
在.vimrc中添加 Plugin 'vim-airline/vim-airline' Plugin 'vim-airline/vim-airline-themes' 然后打开vim编辑器执行 :Pl ...
- vim 将文件从dos格式转换到unix格式
dos格式文件传输到unix系统时,会在每行的结尾多一个^M(/r),当然也有可能看不到.但是在vim的时候,会在下面显示此文件的格式,比如 "dos.txt" [dos] 120 ...
- Spark读取结构化数据
读取结构化数据 Spark可以从本地CSV,HDFS以及Hive读取结构化数据,直接解析为DataFrame,进行后续分析. 读取本地CSV 需要指定一些选项,比如留header,比如指定delimi ...