状压dp(总结)状态压缩
状压这个和二进制分不开关系
所以,对于二进制的熟悉是必不可少的技能
& 与操作,1不变,0变0
| 或操作,0不变,1变1
^ 异或操作,0不变,1取反
~ 取反操作,把每一个二进制位0变1,1变0
还有一些复杂操作可以根据这些去理解
状态压缩
所谓状态压缩就是把dp的每一次转移时的状态用二进制来表示
或者用二进制来间接表示
比如
这里有10个苹果,编号1-10
我拿走了1,4,7,9这四个苹果
那么我们可以用011011010这一串二进制数来表示现在的状态
0表示这个位置没有苹果,1表示有
那么这就是一个状态
相比拿一个bool型的数组,这样表示更方便,内存更小,操作更简单
现在我想把拿走的苹果放回去,没拿走的拿走
那么状态就变成100100101
直接取反 a=011011010 b=100100101
a==~b;
这时候就充分展示了状态压缩的快捷性
下面我们讲一道例题。。。。。
在n*n(n≤20)的方格中放置n个车,每个车可以攻击所在的行和列,求方案总数
直接上排列组合,n!,很好理解啊
在n*n(n≤20)的方格棋盘上放置n 个车,某些格子不能放,求使它们不能互相攻击的方案总数。
这时候一些格子不能放,就要考虑每一行的情况
但是 ,,,,即使每一行中有的格子不能放,最终还是每一行每一列都要有一个车子
所以我们用s这个int型的数来表示现在的状态(行状态)
如果这一列现在有车子,那这一位就是1
所以最终s一定会变成11111111111(全是1)只有这样才能把n个车全部放进去
这样这一状态有几个车子说明这就是第几行
那这样转移方程就有了
dp[s]+=dp[s^(s&-s)];
for(;j>0;j-=(j&-j)){
dp[i]+=dp[i^(j&(-j))];
}
还有个问题,有些格子不能放车
这怎么办???????????
还记得前面的苹果吗
用1表示这里能放车子,0表示不可以
在状态转移的时候&一下就可以啦
j=i&s[num];
代码如下
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
long long dp[1<<20];
int s[25];
int main(){
memset(s,0x7fffffff,sizeof(s));
//if(s[1][1]==1)cout<<"sh";
//cout<<(s[1][1]&0)<<endl;
scanf("%d%d",&n,&m);
int x,y;
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
s[x]-=(1<<(y-1));
}
dp[0]=1;
for(int i=1;i<(1<<n);i++){
int j,num=0;
for(j=i;j>0;j-=(j&(-j))){
num++;
}
j=i&s[num];
for(;j>0;j-=(j&-j)){
dp[i]+=dp[i^(j&(-j))];
}
}
printf("%lld",dp[(1<<n)-1]);
}
这样基本的状压dp就结束了
也许你已经发现了
所有的n都小于等于20
因为int只有32位
这也是状压的前提
所以当你一直为空间时间复杂度着急时
就去考虑状压
而状压前先找到可以状压的数
就是32位以内的
over

状压dp(总结)状态压缩的更多相关文章
- 状压dp(状态压缩&&dp结合)学习笔记(持续更新)
嗯,作为一只蒟蒻,今天再次学习了状压dp(学习借鉴的博客) 但是,依旧懵逼·································· 这篇学习笔记是我个人对于状压dp的理解,如果有什么不对的 ...
- [ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp
题意: 有一块n*m的土地 0代表不肥沃不可以放牛 1代表肥沃可以放牛 且相邻的草地不能同时放牛 问最多有多少种放牛的方法并对1e8取模 思路: 典型的状压dp 能状态压缩 能状态转移 能状态压缩的题 ...
- 51Nod1626 B君的梦境 状压dp 矩阵
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1626.html 题目传送门 - 51Nod1626 题意 题解 首先考虑形象的想象本题中的思维空间. ...
- 状压DP概念 及例题(洛谷 P1896 互不侵犯)
状压DP 就是状态压缩DP.所谓状态压缩,就是将一些复杂的状态压缩起来,一般来说是压缩为一个二进制数,用01来表示某一元素的状态. 比如一排灯泡(5个) 我们可以用一串二进制01串来表示他们的状态 1 ...
- 有关状压DP
[以下内容仅为本人在学习中的所感所想,本人水平有限目前尚处学习阶段,如有错误及不妥之处还请各位大佬指正,请谅解,谢谢!] 引言 动态规划虽然已经是对暴力算法的优化,但在某些比较特别的情况下,可以通过一 ...
- 【51Nod】1920 空间统计学 状压DP
[题目]1920 空间统计学 [题意]给定m维空间中的n个点坐标,满足每一维坐标大小都在[0,3]之间,现在对于[0,3*m]的每个数字x统计曼哈顿距离为x的有序点对数.\(n \leq 2*10^5 ...
- 牛客练习赛49 B 筱玛爱阅读 (状压DP,子集生成)
链接:https://ac.nowcoder.com/acm/contest/946/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262875K,其他语言5257 ...
- hdu4352-XHXJ's LIS状压DP+数位DP
(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 题意:传送门 原题目描述在最下面. 在区间内把整数看成一个阿拉伯数字的集合,此集合中最长严格上升子序列的长度为k的个数. 思路: ...
- 状态压缩动态规划 状压DP
总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...
- dp乱写1:状态压缩dp(状压dp)炮兵阵地
https://www.luogu.org/problem/show?pid=2704 题意: 炮兵在地图上的摆放位子只能在平地('P') 炮兵可以攻击上下左右各两格的格子: 而高原('H')上炮兵能 ...
随机推荐
- 06- web兼容性测试与web兼容性测试工具
web兼容性概述 定义:软件兼容性测试是指检查软件之间能否正确地进行交互和共享信息.随着用户对来自各种类型软件之间共享数据能力和充分利用空间同时执行多个程序能力的要求,测试软件之间能否协作变得越来越重 ...
- hdu1305 字典树水题
题意: 给你一些字符串,然后问你他们中有没有一个串是另一个串的前缀. 思路: 字典树水题,(这种水题如果数据不大(这个题目不知道大不大,题目没说估计不大),hash下也行,把每个 ...
- hdu4740 不错的简单搜索
题意: 给你一个n*n的图,给你驴和老虎的初始坐标和方向,已知他们的速度相同,他们走动的时候都是走直线,如果不能走,驴往右拐,老虎往左拐,如果拐了一次还走不了就原地不动,问他们的最早相遇位置 ...
- typecho+宝塔搭建
在这个互动视频中很详细的讲解到了 https://www.bilibili.com/video/BV1o4411r7x5?spm_id_from=pageDriver
- Insert Pictures In Hexo Blog
After build my blog following the online course step by step , I began to try to write my own blog️ ...
- vue 访问页面时报错 Failed to compile
这个是因为node-sass没安装好,所以要重新安装 windows下运行命令:npm install node-sass --registry=https://registry.npm.taobao ...
- 基于Gitlab的CICD流程
本片文章主要初步介绍什么是CICD流程,并且把整个流程进行拆分理解整个流程的跑通过程. 1.CICD概述 什么是CICD呢? 简单的说CICD就是持续集成自动构建自动测试自动部署. 从概念上就可以看出 ...
- Linux的基础操作
1.概念 Linux是基于Unix的开源免费的操作系统,由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境. 2.Linux的分类 1.按市场需求分为: 图形化界面版.服务器版 2.按原生程度 ...
- Codeforces Round #660 (Div. 2)
A. Captain Flint and Crew Recruitment 题意:定义了一种数(接近质数),这种数可以写成p*q并且p和q都是素数,问n是否可以写成四个不同的数的和,并且保证至少三个数 ...
- Davinci 可视化系统部署安装及简单使用
Davinci 是一个目前比较热门的国内开源BI系统,功能比较完善,各种可视化效果也挺不错.主要获取数据的方式是通过编写SQL 创建数据视图来展示各种图表的. Davinci面向业务人员/数据工程师/ ...