动态规划——状压DP 学习笔记

这篇具有很好参考价值的文章主要介绍了动态规划——状压DP 学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

动态规划——状压DP 学习笔记

引入

前置知识:位运算

动态规划的过程是随着阶段的增长,在每个状态维度上不断扩展的。

在任意时刻,已经求出最优解的状态与尚未求出最优解的状态在各维度上的分界点组成了 DP 扩展的“轮廓”。对于某些问题,我们需要在动态规划的“状态”中记录一个集合,保存这个“轮廓”的详细信息,以便进行状态转移。

若集合大小不超过 \(N\),集合中每个元素都是小于 \(K\) 的自然数,则我们可以把这个集合看作一个 \(N\)\(K\) 进制数,以一个 \([0, K^{N - 1}]\) 之间的十进制整数的形式作为 DP 状态的一维。这种把集合转化为整数记录在 DO 状态中的一类算法,就被称为状态压缩的动态规划算法。

定义

意义

状态压缩,即在数据范围较小的情况下,将每个物品或者东西选与不选的状态压缩为一个整数的方法。

状态压缩,即以最小代价来表示某种状态的方式,通常是用一串二进制数(\(01\) 串)来表示各个元素的状态,通常我们称这些情况叫做子集、设为 \(S\)

然而还有其他的状压方法,例如三进制状压法等等,但不大常用。

本质

所以状压 DP,本质上是与 DP 无异的,它没有改变 DP 本质的优化方法,阶段还是要照分,状态还是老样子,决策依旧要做,转移方程还是得列,最优还是最优,无后性还是无后性,所以它还是比较好理解的。所以最明显的标志就是数据不能太大,大约是 \(n \le 20\)

遍历所有状态的正确姿势就是用二进制的位运算来遍历。这大概就是状压 DP 的精髓了吧!

应用

什么时候用?

  • 数据范围:范围在 \(20\) 左右时正常的状压;很多时候会有一些 NP 问题会用状压求解。
  • 是否可以压缩:一般的状态压缩都是选择或者不选择,放或者不放,遇见这种东西一般时状压。
  • 常见题目模型:比如 TSP,覆盖问题之类的。经常会有这种模型的题出现就可以使用状压。

状态设计

在使用状压 DP 的题目当中,往往能一眼看到一些小数据范围的量,切人点明确。而有些题,这样的量并不明显,需要更深人地分析题目性质才能找到。

  1. 状态跟某一个信息集合内的每一条都有关。
  2. 若干条精简而相互独立的信息压在一起处理。(如每个数字是否出现)

例题:旅行商(TSP)问题

状态压缩最经典的问题应该就是旅行商问题了。

问题描述

旅行商问题(Travelling Salesman Problem,TSP),给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。

如何运用状态压缩

比如一共有 \(5\) 个点:\(\{1\:2\:3\:4\:5\}\)。现在要表示已经走过的地方和没走过的地方,我们可以用 \(\{0, 1\}\) 来表示。其中 \(0\) 表示没到过,\(1\) 表示到达过。那么对应的状态有:

1 2 3 4 5
0 0 0 0 0(刚要开始走,还没有到达的地方)
0 0 0 0 1(已经到过第五个点)
0 0 0 1 0(已经到过第四个点)
0 0 0 1 1(已经到过第四,五个点)
......

我们发现以上的状态可以用二进制数表示,二进制数就是由 \(\{0, 1\}\) 组成的。并且 \(2^5\) 可以涵盖所有的情况,从 \(0\:0\:0\:0\:0\)\(1\:1\:1\:1\:1\)

\(dp[i][S]\) 表示走到 \(i\) 这个点,已经经过的地方为 \(S\),此时所走过的最短路。

状态转移

举个栗子,当 \(S = (11011)_{\mathrm B}\) 的时候,\(S\) 可以是由 \(11001\) 来,也可以是从 \(11010\) 来:

for (int j = 1; j <= n; ++j) {
    if (i == j || (s & (1 << (j - 1))) == 0) continue;
    dp[i][s] = min(dp[i][s], dp[j][s - (1 << (i - 1))] + dis(i, j));
}

练习题

见:https://www.luogu.com.cn/training/384914

Reference

[1] https://www.luogu.com.cn/blog/new2zy/zhuang-ya-zhuang-ya-post
[2] https://www.luogu.com.cn/blog/yijan/zhuang-ya-dp
[3] https://www.luogu.com.cn/blog/DestinHistoire/zhuang-tai-ya-su-dp
[4] https://www.cnblogs.com/maoyiting/p/13368682.html
[5] https://blog.csdn.net/qq_44579321/article/details/129489274
[6] https://blog.csdn.net/weixin_44254608/article/details/105761281文章来源地址https://www.toymoban.com/news/detail-710481.html

到了这里,关于动态规划——状压DP 学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划——树形DP 学习笔记

    前置知识:树基础。 树形 DP,即在树上进行的 DP,最常见的状态表示为 (f_{u,cdots}) ,表示以 (u) 为根的子树的某个东东。 本文将讲解一些经典题目(树的子树个数、树的最大独立集、树的最小点覆盖、树的最小支配集、树的直径、树的重心、树的中心),以及一些常见形

    2024年02月08日
    浏览(38)
  • 动态规划——矩阵优化DP 学习笔记

    前置知识:矩阵、矩阵乘法。 斐波那契数列 在斐波那契数列当中, (f_1 = f_2 = 1) , (f_i = f_{i - 1} + f_{i - 2}) ,求 (f_n) 。 而分析式子可以知道,求 (f_k) 仅与 (f_{k - 1}) 和 (f_{k - 2}) 有关; 所以我们设矩阵 (F_i = begin{bmatrix} f_{i - 1} f_{i - 2} end{bmatrix}) 。 设矩阵 (text{Ba

    2024年02月08日
    浏览(56)
  • 动态规划——斜率优化DP 学习笔记

    适用于求解最优解(最大、最小)问题。 可以将转移方程可以化为 (left[begin{array}{rl} 仅与 space i space 有关 是我们想要最大/最小化的 \\\\ 仅与 space j space 有关 是已知的 \\\\ 与 space i space 和 space j space 都有关 是两项相乘 end{array}right]) 三部分的, 都可以考虑用斜率优化

    2024年02月08日
    浏览(47)
  • 动态规划——决策单调性优化DP 学习笔记

    对于最优性问题,常有状态转移方程: (f_i = min/max{f_jdots}) , 形象的:如果 (i) 的最优转移点是 (j) , (i\\\') 的最优转移点是 (j\\\') ,当 (ii\\\') 时,有 (jle j\\\') ,则称该 DP 问题具有决策单调性。 即: (i) 单增,其最优转移点单调不减。 如何发现一个转移方程具有决策

    2024年02月08日
    浏览(51)
  • 动态规划——带权二分优化DP 学习笔记

    带权二分其实并不一定用于优化 DP,也可能用于优化贪心等最优化的算法。 带权二分也叫 WQS 二分,最初由王钦石在他的 2012 年国家集训队论文中提出。 使用情况 要解决一个最优化问题(求最大 / 最小值) 有一个限制,一般是某个参数要求一定恰好为 (k) 而带权二分就可以

    2024年02月08日
    浏览(37)
  • AcWing算法学习笔记:动态规划(背包 + 线性dp + 区间dp + 计数dp + 状态压缩dp + 树形dp + 记忆化搜索)

    算法 复杂度 时间复杂度0(nm) 空间复杂度0(nv) 代码 算法 通过滚动数组对01背包朴素版进行空间上的优化 f[i] 与 f[i - 1]轮流交替 若体积从小到大进行遍历,当更新f[i, j]时,f[i - 1, j - vi] 已经在更新f[i, j - vi]时被更新了 因此体积需要从大到小进行遍历,当更新f[i, j]时,f[i - 1,

    2024年02月21日
    浏览(43)
  • 动态规划(DP)(算法笔记)

    本文内容基于《算法笔记》和官方配套练题网站“晴问算法”,是我作为小白的学习记录,如有错误还请体谅,可以留下您的宝贵意见,不胜感激。 动态规划(Dynamic Programming,DP)是一种用来解决一类最优化问题的算法思想。简单来说,动态规划将一个复杂的问题分解成若干个子

    2024年02月05日
    浏览(47)
  • 动态规划(DP)学习和思考

    最近在备战蓝桥杯,感觉蓝桥杯很多题目都可以尝试用暴力搜索,暴力枚举的方法尝试得出最终的结果,但是暴力的方式效率并不是很高,而且容易超时。在以前学回溯算法的时候,也是一脸懵,不理解IndexStart到底什么意思,不知道如何去找参数和递归逻辑,好在通过慢慢的

    2024年04月09日
    浏览(39)
  • 算法基础复盘笔记Day10【动态规划】—— 线性DP

    ❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于 Java后端开发 ,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得 关注 、 点赞 、 收藏 、 评论 ⭐️⭐️⭐️ 📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉 1. 题目

    2023年04月21日
    浏览(83)
  • 动态规划-闫氏老方!中华老字号(DP笔记)

    b站视频 💡 Tips:求有限集中的最值 朴素写法 优化空间之后的写法 怎么说呢,就是原来第二个算式是f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]),注意 f[i - 1] [j - v[i]],需要i-1,也就是前一个。 要是从左往右边算的话,✨(假如我们来到了第四行,正在计算f[5]需要用到f[4]的数据)

    2024年04月29日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包