首页 > 其他分享 >动态规划——状压DP 学习笔记

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

时间:2023-09-26 21:45:43浏览次数:39  
标签:状态 www 压缩 状压 笔记 https 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

标签:状态,www,压缩,状压,笔记,https,DP
From: https://www.cnblogs.com/RainPPR/p/state-dp.html

相关文章

  • Linux的双链表复习—Apple的学习笔记
    一,前言   今天想把linux的双链表base代码拿来单片机用,于是看了下,结果有点混乱了。那么就画了个链表变化图,且做了实验进行巩固。二,分析链表头插方法主要是root然后添加t1,然后添加t2。那么链表的变化是RootRoot->t1Root->t2->t1如下图,R代表root头节点,1代表t1节点,2代表t2节点。......
  • 九月份《程序员修炼之道:从小工到专家》读书笔记1
    《程序员修炼之道:从小工到专家》是一本非常受欢迎的计算机科学类书籍,作者AndrewHunt和DavidThomas通过通俗易懂的语言和生动的案例,向读者介绍了如何成为一名优秀的程序员。作为一名大二学生,我阅读了这本书,并从中受益匪浅。首先,书中强调了编程中的实践和实证。它教导我们不仅仅要......
  • 九月份《程序员修炼之道:从小工到专家》读书笔记2
    《程序员修炼之道:从小工到专家》是一本极具启发性的计算机科学类书籍,对于像我这样的大二学生来说,阅读这本书是一次学习和成长的机会。作者AndrewHunt和DavidThomas通过书中的经验分享和实践指南,为我们展示了成为一名卓越程序员的道路。首先,本书强调了编程中的基本原则和方法。作......
  • Python 语法笔记
    快速入门Python(随便乱记的笔记)https://docs.python.org/zh-cn/3/tutorial/index.htmlhttps://www.runoob.com/python/python-tutorial.html输入input()函数input直接读取一整行(不允许存在空格),返回值为string类型一行中仅有一个数时,返回所输入的数字的数据类型没有空格时......
  • 《信息安全系统设计与实现》第四周学习笔记
    第七章文件操作级别硬件级别fdiskmkfsfsck碎片整理操作系统内核中的文件系统函数系统调用I/O库函数用户命令sh脚本文件I/O操作低级别文件操作分区Command(mforhelp):m---输出帮助信息Commandactionatoggleabootableflag---设置启动分区b......
  • Binomial Sum 学习笔记
    这是EI写的一个神秘科技。我只能把它最简单的东西讲述出来。用于\(O(k+\logn)\)复杂度解决一类求和问题。使用条件:\(f(x)\)微分有限,话句话说,存在\(f\)的微分方程。如果我容易知道\(\displaystyle\sum_{i=0}^{n}a_i[x^i]G(x)^k,k\in[0,]\),那么我就可以\(O(n)\)求\(\displaystyl......
  • openGauss学习笔记-80 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT性能基
    openGauss学习笔记-80openGauss数据库管理-内存优化表MOT管理-内存表特性-MOT性能基准本节介绍了openGauss内存优化表(Memory-OptimizedTable,MOT)的MOT性能基准。80MOT性能基准我们的性能测试是基于业界和学术界通用的TPC-C基准。测试使用了BenchmarkSQL(请参见MOT样例TPC-C基......
  • openGauss学习笔记-81 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用概
    openGauss学习笔记-81openGauss数据库管理-内存优化表MOT管理-内存表特性-MOT使用概述MOT作为openGauss的一部分自动部署。有关如何计算和规划所需的内存和存储资源以维持工作负载的说明,请参阅MOT准备。参考MOT部署了解MOT中所有的配置,以及服务器优化的非必须选项。使用MOT的方......
  • NLP经典论文,自我回顾笔记
    (持续更新,目前找工作中)1. SequencetoSequenceLearningwithNeuralNetworks(2014GoogleResearch)However,thefirstfewwordsinthesourcelanguagearenowveryclosetothefirstfewwordsinthetargetlanguage,sotheproblem’sminimaltime......
  • 极光笔记 | 聊一聊推送系统中事件驱动架构的应用
    微服务间通信方式主要有2种:RPC和消息传递。通常来说在请求/响应的场景下使用RPC更加合适,具体实现通常是RESTAPI或者基于长链接的协议(例如gRPC/Thrift/ZeroICE等)。两个服务有比较强的依赖关系,调用者依赖被调用者的处理结果,调用者处理该请求被堵塞以等待响应结果,同时还要进行负载......