状压DP概念 及例题(洛谷 P1896 互不侵犯)
状压DP 就是状态压缩DP。所谓状态压缩,就是将一些复杂的状态压缩起来,一般来说是压缩为一个二进制数,用01来表示某一元素的状态。
比如一排灯泡(5个) 我们可以用一串二进制01串来表示他们的状态 11111就是全开 00000就是全关 00001就是只开了第五个 00101就是第三和第五个开了 以此类推.....而这个二进制串是可以用一个十进制数表示的 比如31就是11111 ,1就是00001等等,这样我们在遍历的时候就不用将五个灯泡疯狂循环,只需要从0遍历到31即可 大大节省了时空。
这里需要解释的是,空间的节省是很显然的,本来需要开一个a[5]的数组来存这些灯泡的一种状态,现在只需要一个数了,但是时间复杂度是怎么体现的呢?明明都是2^5种情况呀!似乎并没有节省遍历带来的时间复杂度......这是因为对于二进制的操作要比通过对存储的状态进行模拟简单得多 举个例子来说:假如我们要求这些灯泡相邻的不能同时亮,如果没有用到状压,就是对每种状态进行判断,如果相邻的状态一样就跳出,那么每种状态都需要从1到5扫一遍,这是很麻烦的,但是经过状压之后,这就容易许多了:x&(x<<1) 即可,比之前的方式省时省力!
需要强调的是,状压本身对于dp没有影响,该怎么dp还是怎么dp,但是对于遍历和操作却方便了很多。
下面列出一些二进制的常规操作(江苏省淮阴中学薛志坚整理)

还有求当前二进制串中1的数量 这个是我写这个博客的时候看到的
int sum=;
while(x){
++sum;
x&=x-;
}
例题
我们采用dp[i][j][s]来表示第i行的状态是j的情况下 前i行放了s个国王的方法总数 很明显,dp[i][j][s]+=dp[i-1][k][s-sum(j)] 其中k代表上一行的状态,sum(j)代表第i行的国王数。
具体来看代码:
#include<bits/stdc++.h> using namespace std; long long int sit,i,N,K,j,k,s,n,dp[][<<][],a[<<],anss; long long int sum(long long int i) //求状态i的国王数
{
long long int a=;
while(i)
{
if(i&)
a++;
i=i>>;
}
return a;
} int main()
{
cin>>N>>K;
n=<<N;
for(i=;i<n;i++)
{
if(i&(i<<)) //判断左右国王是否冲突
continue;
a[++sit]=i;
dp[][sit][sum(i)]=; //初始化
}
for(i=;i<=N;i++)
{
for(k=;k<=sit;k++) //上一行
{
for(j=;j<=sit;j++) //本行
{
if(a[k]&a[j]) //上下有国王冲突
continue;
if(a[k]&(a[j]<<)) //右上有国王冲突
continue;
if(a[k]&(a[j]>>)) //左上有国王冲突
continue;
for(s=K;s>=sum(a[j])+sum(a[k]);s--) //遍历前i行放置的国王总数 这里我看的其他博客上写的都是 s>=sum(a[j]) 但是我感觉不需要 因为你得满足前一行的状态
dp[i][j][s]+=dp[i-][k][s-sum(a[j])];
}
}
}
for(i=;i<=sit;i++)
anss+=dp[N][i][K]; //遍历最后一行的状态 输出答案
cout<<anss<<endl;
}
需要注意的是 要用 long long 否则是70分......
状压DP概念 及例题(洛谷 P1896 互不侵犯)的更多相关文章
- 状压dp大总结1 [洛谷]
前言 状态压缩是一种\(dp\)里的暴力,但是非常优秀,状态的转移,方程的转移和定义都是状压\(dp\)的难点,本人在次总结状压dp的几个题型和例题,便于自己以后理解分析状态和定义方式 状态压缩动态规 ...
- 洛谷P1896 互不侵犯
又是一道状压DP求方案数的题... 多了一个放k个的限制,于是我们把数组多开一维. f[i][j][k]表示前i行放了j个,第i行状态为k的方案数. 然后老套路DFS转移,这次要多记录一个cnt表示上 ...
- 洛谷 P1896 互不侵犯King
P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...
- 状压dp之二之三 炮兵阵地/玉米田 By cellur925
一.简单的状压dp 玉米田 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ ...
- 状压dp入门
状压dp的含义 在我们解决动态规划题目的时候,dp数组最重要的一维就是保存状态信息,但是有些题目它的具有dp的特性,并且状态较多,如果直接保存的可能需要三维甚至多维数组,这样在题目允许的内存下势必是开 ...
- 洛谷P3959 宝藏(NOIP2017)(状压DP,子集DP)
洛谷题目传送门 Dalao的题解多数是什么模拟退火.DFS剪枝.\(O(3^nn^2)\)的状压DP之类.蒟蒻尝试着把状压改进了一下使复杂度降到\(O(3^nn)\). 考虑到每条边的贡献跟它所在的层 ...
- 【题解】洛谷P3959 [NOIP2017TG] 宝藏(状压DP+DFS)
洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复 ...
- 【题解】洛谷P2704 [NOI2001] 炮兵阵地(状压DP)
洛谷P2704:https://www.luogu.org/problemnew/show/P2704 思路 这道题一开始以为是什么基于状压的高端算法 没想到只是一道加了一行状态判断的状压DP而已 与 ...
- 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)
洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...
随机推荐
- getpass.getpass 无法在pycharm上run显示的 workaround
getpass.getpass 只能通过交互式终端运行.py文件来密文输入密码,想在pycharm里运行,好不容易找到一个小窍门,记录如下 from easygui import passwordbo ...
- bzoj1584 9.20考试 cleaning up 打扫卫生
1584: [Usaco2009 Mar]Cleaning Up 打扫卫生 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 549 Solved: 38 ...
- OpenCV多版本切换和配置--opencv 安装与卸载、添加 opencv_contrib modules 以及 OpenCv 多版本切换
1. 查看安装Opencv的版本.以及libs和cflags $ pkg-config --modversion opencv $ pkg-config --cflags opencv // 编译链接 ...
- 万能RecyclerView的数据适配器BaseRecyclerViewAdapterHelper
今天楼主才发现github上有这么一个好用的开源代码,充满好奇心的楼主马上使用了,特地分享给大家. 此项目的github地址: https://github.com/CymChad/BaseRecyc ...
- 关于页面scroolTop的获取
scroolTop 发现问题 获取页面滚动高度的时候: 当html页面设置了DTD<!DOCTYPE html> document.body.scroolTop // 值总是为0: doc ...
- 读完这篇文章,5G 就没有秘密了
如果我们现在要制作一个 2019 年的热词排行榜,相信 5G 一定名列榜单前茅.作为第五代移动通信网络,5G 技术一直备受瞩目.随着 5G 商用牌照在国内的发放,各大手机厂商也是紧接着推出各款 5G ...
- 第三章 JavaScript操作Dom对象
常用的方法: 1.访问节点: 通过Document.getElementByXXX()获得一个指定节点-->再通过以下属性节点访问节点:第一部分:节点属性a:parentNode 返回节点的父节 ...
- 使用log4j进行日志管理
17.1.Log4j简介 作用: 1. 跟踪代码的运行轨迹. 2. 输出调试信息. 三大组成: 1. Logger类-生成日志. 2. Appender类-定义日志输出的目的地. 3. Layou ...
- 在工作中常用到的SQL
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 最近在公司做了几张报表,还记得刚开始要做报表的时候都 ...
- 移动端H5多终端适配解决方案
推荐三篇文章: 1.来自手淘团队的开源技术flexibal.js github地址:https://github.com/isHelenaChan/flexible 2.来自“大漠”(就职于淘宝,也是 ...