0 引子

不要999,也不要888,只要288,只要288,状压DP带回家。你买不了上当,买不了欺骗。它可以当搜索,也可以卡常数,还可以装B,方式多样,随心搭配,自由多变,一定符合你的口味!

在计算机里,整数是以二进制的方式存储的。把状态信息压缩成二进制当成状态进行动态规划,就是状压DP的基本思想。

是不是一脸懵比?别急着关掉文章,接着往下看,你会发现一个新世界。

0.5 状压能解决什么样的问题?

让我们康康这道题:传送门

很容易想到搜索,不是吗?

然而,我们要用更装比 复杂 优美的方式完成这道题。

1.什么是“状态压缩?”

举个例子吧。例如,例题里的“取哪些砝码”这个信息,就可以压缩进一个int整数里。因为,int整数是二进制存储的。大概长这样:

\[\]

十进制 二进制(也就是计算机里实际的状态)
1 1
2 10
114514 11011111101010010
6 110

我们可以发现,数字是由许多二进制位构成的,要么是0要么是1。

是不是发现了什么?

没错,我们可以用每一位的0和1表示每一个砝码选或者不选!

例如,数字 2 (二进制:10) 就可以表示1号砝码不选,2号砝码选的状态。(因为第1位是0,第2位是1)。

知道了如何压缩,就可以用动态规划的方式求解了。

2.如何枚举出每一个状态?

事实上十分简单,这样就可以:

  1. for(int i=0;i<=(1<<n)-1;i++){
  2. }

(1<<n是把1左移n位的意思。例如,1<<3的二进制就是1000,十进制就是8)

我们来模拟一下\(n=3\)时的情况。

i i的二进制
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111

可以发现,i把所有砝码选取情况都枚举出来了。

3.如何转移?

这个其实因题而异,我就用这道题举例子吧

  1. for(int i=1;i<(1<<n);i++){//枚举。因为i=0就是一个也不选,所以不需要枚举。
  2. int high_bit=0,high_bit_num=0;
  3. for(int j=31;j>=0;j--){//int最多有31位,所以j=31-0。
  4. if((i>>j)&1){//意思是i的第j位是否为1
  5. high_bit=1<<j;
  6. high_bit_num=j;
  7. break;//找到了就退出来
  8. }
  9. }//求出当前方案的最高位
  10. sum[i]=sum[i^high_bit]+a[high_bit_num+1];//转移。因为i是“按顺序”枚举的,所以去掉最高位后的方案一定枚举过了。
  11. //i^high_bit的意思是去掉最高位
  12. cnt[i]=cnt[i^high_bit]+1;
  13. }

(这段代码求的是每种砝码选取方案的重量和与每种砝码选取方案要用多少砝码)

注释写的很详细,我就不再罗嗦了。

4.如果你想A掉这道题

你可以康康我的题解:传送门

但是我还是建议你自己做出来

5.写在最后

状压dp和其它所有算法一样,需要大量的练习才能掌握。

这篇文章写的可能不怎么全面,欢迎在评论区提问或指出。另外,不要吊死在一棵树上,多康康别人的文章吧。

状态压缩动态规划(状压DP)详解的更多相关文章

  1. 状态压缩动态规划 状压DP

    总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...

  2. 状态压缩dp 状压dp 详解

    说到状压dp,一般和二进制少不了关系(还常和博弈论结合起来考,这个坑我挖了还没填qwq),二进制是个好东西啊,所以二进制的各种运算是前置知识,不了解的话走下面链接进百度百科 https://baike ...

  3. 状压DP详解+题目

    介绍 状压dp其实就是将状态压缩成2进制来保存 其特征就是看起来有点像搜索,每个格子的状态只有1或0 ,是另一类非常典型的动态规划 举个例子:有一个大小为n*n的农田,我们可以在任意处种田,现在来描述 ...

  4. 状压DP详解(位运算)

    前言: 状压DP是一种非常暴力的做法(有一些可以排除某些状态的除外),例如dp[S][v]中,S可以代表已经访问过的顶点的集合,v可以代表当前所在的顶点为v.S代表的就是一种状态(二进制表示),比如 ...

  5. hihoCoder 1044 : 状态压缩·一 状压dp

    思路:状态压缩,dp(i, j)表示考虑前i个数且[i-m+1, i]的选择情况为j.如果要选择当前这个数并且,数位1的个数不超过q,则dp[i+1][nex] = max(dp[i+1][nex], ...

  6. hihocoder #1044 : 状态压缩·一 状压DP

    http://hihocoder.com/problemset/problem/1044 可以看出来每一位的选取只与前m位有关,我们把每个位置起始的前m位选取状态看出01序列,就可以作为一个数字来存储 ...

  7. 动态规划---状压dp

    状压dp,就是把动态规划之中的一个个状态用二进制表示,主要运用位运算. 这里有一道例题:蓝书P639猛兽军团1 [SCOI2005]互不侵犯 题目: 题目描述 在N×N的棋盘里面放K个国王,使他们互不 ...

  8. 【bzoj3195】【 [Jxoi2012]奇怪的道路】另类压缩的状压dp好题

    (上不了p站我要死了) 啊啊,其实想清楚了还是挺简单的. Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期 ...

  9. 【状压DP】bzoj1087 互不侵犯king

    一.题目 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上.下.左.右,以及左上.左下.右上.右下八个方向上附近的各一个格子,共8个格子. I ...

随机推荐

  1. GitHub 热点速览 Vol.30:那些提升效率的小工具们

    摘要:虽然 GitHub 是一个学习技术的好去处,但是除了学习,它还集提高"搬砖"效率于一身.GitHub 上散落着各式各样的小工具,比如本周特推的 Adobe 开源的 React ...

  2. PHP xml_parser_create_ns() 函数

    定义和用法 xml_parser_create_ns() 函数创建带有命名空间支持的 XML 解析器.高佣联盟 www.cgewang.com 如果成功,该函数则返回可被其它 XML 函数使用的资源句 ...

  3. python3 openssl问题(贼有用)

    目录 一.问题描述 二.排查过程 三.总结 四.写在最后 一.问题描述 在python3 执行任何的request请求时,都会报以下的错误,纵观全网,以下基本尝试过了,对于我这个是无效的,后来不知道怎 ...

  4. jar包冲突解决

    背景: 新需求需要引入新jar包,引入后发现本地启动没有报错,发到测试环境提示某个bean无法创建,nested exception is java.lang.VerifyError: Bad typ ...

  5. javascript逻辑运算与循环笔记

        短路运算(逻辑中断)     1.短路运算的原理:当有多个表达式(值)时,左边的表达式值可以确定结果的时候就不再继续运算右边的表达式的值     2.逻辑与 &&     如果 ...

  6. 使用免费证书安装 ipa 到真机

    使用免费证书安装 ipa 密码设置 进入 AppleId 官网 登录个人账号 登录进去之后, 找到 Security, 点击 Generate Password... 锁边输入几个字符, 再点击 Cr ...

  7. 咕咕咕清单(SCOI2020前)

    本篇博客已停更 本篇博客已停更 本篇博客已停更 吐槽区: 2020.04.15: 从今天起我做过的题目都记录一下,想不想写题解就另说了 2020.04.17: 写了两天之后真实的发现这是博主的摸鱼日记 ...

  8. Qt之先用了再说系列-多线程方式1

    Qt 多线程的用法还是比较简单的,也比较好用,接下来我们就分析分析如何使用. 说起Qt 线程的使用方式,一般有2种使用方式,具体哪种比较好看自己心情了,现在有官方的推荐用法,用不用还是看你心情的 好, ...

  9. C#LeetCode刷题之#849-到最近的人的最大距离(Maximize Distance to Closest Person)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3754 访问. 在一排座位( seats)中,1 代表有人坐在座位 ...

  10. 01 树莓派4B—C语言编程——GPIO

    #include <stdio.h>#include <wiringPi.h> int main( void){ int LED1 = 1; int LED4 = 4; wir ...