状压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')上炮兵能 ...
随机推荐
- [C#] NAudio 库的各种常用使用方式: 播放 录制 转码 音频可视化
概述 在 NAudio 中, 常用类型有 WaveIn, WaveOut, WaveStream, WaveFileWriter, WaveFileReader 以及接口: IWaveProvider ...
- Nginx 负载均衡方案
轮询 根据Nginx配置文件中的顺序,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除. upstream web { server server1; serve ...
- 【Feign/Ribbon】记录一次生产上的SpringCloudFeign的重试问题
在上周在的微供有数项目中(数据产品),需要对接企业微信中第三方应用,在使用Feign的去调用微服务的用户模块用微信的code获取access_token以及用户工厂信息时出现Feign重试超时报错的情 ...
- Linux中grep工具的使用
Grep grep(Globel Search Regular Expression and Printing out the line)全面搜索正则表达式并把行打印出来,是一种强大的文本搜索工具,是 ...
- POJ1679判断最小生成树的唯一性
题意: 判断最小树是否唯一. 思路: 我用了两种方法,主要就是好久没敲了,找个水题练练手,第一种就是先一遍最小生成树,然后枚举最小生成树上的每一条边,然后取消这条边,在跑一遍最小生 ...
- ajax提交session超时跳转页面使用全局的方法来处理
来自:http://www.jb51.net/article/43770.htm 如果是ajax提交,超时时从服务器发出的跳转命令就不会起作用,所以如果是session超时,而且是在ajax请求,就在 ...
- Kafka源码分析(二) - 生产者
系列文章目录 https://zhuanlan.zhihu.com/p/367683572 目录 系列文章目录 一. 使用方式 step 1: 设置必要参数 step 2: 创建KafkaProduc ...
- 运维告诉我CPU飙升300%,为什么我的程序上线就奔溃了
线上服务CPU飙升 前言 功能开发完成仅仅是项目周期中的第一步,一个完美的项目是在运行期体现的 今天我们就来看看笔者之前遇到的一个问题CPU飙升的问题. 代码层面从功能上看没有任何问题但是投入使用后却 ...
- 一个入门级CTF的Reverse
这道题是XCTF攻防世界上的一道新手入门题目! 年前刚接触逆向时IDA,OD了这些工具都不会用(负基础),当时做这些题的时候觉得挺难(主要是缺少练习,没思路无从下手).现在回头再来看这些题目感觉确实是 ...
- UI设计师、平面设计师常用的网站大全,初学者必备,大家都在用!
UI设计师.平面设计师常用的网站大全,初学者必备,大家都在用! 国外的花瓣--Pinterest • The world's catalog of ideas 颜格视觉--app界面设计大全--电商. ...