当前位置: 首页 > news >正文

状压DP学习笔记[浅谈]

状压 DP 是动态规划的一种,通过将状态压缩为整数来达到优化转移的目的。
by OI Wiki

前语

对于状压,一打开洛谷的题单你就可以看到满屏的蓝和紫,是不是很吓人,显然就是很吓人
状压题目一般有一个同性,就是数据范围不会特别大,一般卡在 16−2016-201620 之间,这就是一个非常显然的提示了,当你发现爆搜无从下手或者肯定会炸的时候,就可以开始考虑状压DP了。
状压叫做状压的原因和他的状态设计有关,如果是背包状态大多是前几件物品放多少空间可获得的最大价值,而状压的状态中,有一个条件一般是由二级制表示的,后续在例题中可以快速理解状压状态的定义。

前置知识

在学习状压之前要先学习几种二级制下的位运算。

  1. &:与运算,在二进制状态下 110010111001011100101 & 100100110010011001001 = 100000110000011000001 即两位都为1返回111否则皆返回000,位数不足向后对齐,其余位数补000.
  2. |:或运算,在二进制状态下 110010111001011100101 & 100100110010011001001 = 110110111011011101101 即两位只要有一位111返回111否则皆返回000,位数不足向后对齐,其余位数补000.
  3. ^:异或运算,在二进制状态下 110010111001011100101 & 100100110010011001001 = 010110001011000101100 即两位不相同返回111否则皆返回000,位数不足向后对齐,其余位数补000.
    知道了上述运算后,即可开始入门状压DP。

例题

P1896 [SCOI2005] 互不侵犯 (来自洛谷)
题目大意:
N×NN \times NN×N 的棋盘里面放 KKK 个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 888 个格子。

分析

对于本题,我们将设置的状态应当可以说明各个位置是否放有国王,按照正常思路,我们会开一个数组,然后在其中对应位置赋值为 000111 来表示该位置是否有国王,但是这很浪费空间,所以就有了状压,状压便将这一个数组变成了一个 010101 组成的二进制数,因为二进制数的唯一性,所有每一个二进制数都可以变成唯一的一个十进制整数由此,大大减小了空间上的开支。

状态设计

按照 dp 的套路,我们设状态:dp[i][j][S] 表示选到了第 i 行,第 i 行的状态为 S,用了 j 个国王的最优方案个数;
那么如何转移呢?我们知道国王的攻击范围是周围的 888 个格子,所以这些格子是不可以放其他国王的,应该在状压枚举的时候避开,那么如何避开呢,由于我们提前用 SSS 表示了国王的位置状态,所以可以根据 SSS 来对国王可放位置进行判断。
至于如何判断,那么就可以使用到上面铺垫的位运算了。
如果在一个国王的正下方有一个国王,那么 S1S1S1 & S2S2S2 肯定 !=0!=0!=0 好理解吧。那么如果在左下角或者右下角呢?那就位移一下就好了啊 <<<<<<>>>>>> 可以分别将一个数的二进制形态向左或右位移一格(向左最右边会补0),所以又可以写出新的式子。由此行外判断部分便解决了。
同理,在行内也需要通过左右位移数列来判断当前方法的合法性。即如果相邻的两个都放了国王将数列向右移再与原数列做 & 运算必不等于 000
到这里为止,本题的大致内容都已经展现了,剩下的就是基本的动态规划转移推到,请读者自行推导或滑到本文最下方阅读题解。

总结

状压DP是Noip及更高级别竞赛常考内容,需要多加联系以巩固提高。
下面给出以下比较好的练手题目:

  1. 互不侵犯(洛谷)
  2. 最长上升子序列(洛谷)
  3. PRZ
  4. Genshin Impact Startup Forbidden III
    本人实力有限,如有不足欢迎大佬们提出。

文章转载自:
http://underexercise .alwpc.cn
http://atacamite .alwpc.cn
http://thing .alwpc.cn
http://oversee .alwpc.cn
http://stupidly .alwpc.cn
http://reenact .alwpc.cn
http://mooneye .alwpc.cn
http://mooring .alwpc.cn
http://deuterostome .alwpc.cn
http://wrapping .alwpc.cn
http://restate .alwpc.cn
http://heyduck .alwpc.cn
http://masher .alwpc.cn
http://xat .alwpc.cn
http://spectrogram .alwpc.cn
http://gmat .alwpc.cn
http://pliable .alwpc.cn
http://grungy .alwpc.cn
http://tormentor .alwpc.cn
http://gyrostatics .alwpc.cn
http://underpainting .alwpc.cn
http://lowlife .alwpc.cn
http://enculturative .alwpc.cn
http://thumbprint .alwpc.cn
http://taig .alwpc.cn
http://isoagglutination .alwpc.cn
http://symbolist .alwpc.cn
http://digged .alwpc.cn
http://unlearnt .alwpc.cn
http://capitoline .alwpc.cn
http://www.dtcms.com/a/290864.html

相关文章:

  • 计算机网络:概述层---计算机网络的性能指标
  • IFN影视官网入口 - 4K影视在线看网站|网页|打不开|下载
  • 算法训练营DAY37 第九章 动态规划 part05
  • Linux开发⊂嵌入式开发
  • 复制docker根目录遇到的权限问题
  • Mac安装Typescript报错
  • macOS 上安装 Kubernetes(k8s)
  • 深度学习-常用环境配置
  • 基于R语言的分位数回归技术应用
  • next.js刷新页面时二级菜单展开状态判断
  • Java 通过 HttpURLConnection发送 http 请求
  • CG-04 翻斗式雨量传感器 分辨率0.1mm,0.2mm可选择 金属材质
  • 数据结构自学Day11-- 排序算法
  • 使用 Longformer-base-4096 进行工单问题分类
  • Redis进阶--缓存
  • Ubuntu 22.04 安装 MySQL 8.0 完整步骤文档
  • 计算机网络中:传输层和网络层之间是如何配合的
  • 7月21日星期一今日早报简报微语报早读
  • 计算机史前时代:从原始计数到机械曙光
  • 计算机发展史:集成电路时代的微缩革命
  • Android 实例 - 分页器封装实现(上一页按钮、下一页按钮、当前页码 / 总页数、每页条数、总记录数)
  • 本地部署AI新选择!LocalAI+cpolar轻松实现隐私安全的远程访问
  • 数据结构:找出字符串中重复的字符(Finding Duplicates in a String)——使用哈希表
  • 一文彻底解释清楚Java 中的NIO、BIO和AIO
  • 记录解决问题--maven本地已有依赖,还是去远程仓库下载,导致打包失败
  • 期权到期会对大盘有什么影响?
  • 本地Linux服务器使用Docker快速部署SyncTV
  • 关于Aop动态代理
  • 线上问题排查之【CPU飙高100%】
  • 深入理解 C++ 中的指针与自增表达式:*a++、(*a)++ 和 *++a 的区别解析