首页 > 其他分享 >状压dp

状压dp

时间:2025-01-18 14:43:25浏览次数:1  
标签:状态 状压 合法 子集 预处理 dp

状压dp

应用背景以集合为状态,集合一般可以用二进制表示,用二进制的位运算处理
集合问题一般是指数复杂度的,例如:1.子集问题,设n个元素没有先后关系,那么一共有 \(2^n\) 个子集;2.排列问题,对所有n个元素进行全排列,共有 \(n!\) 个排列
状态压缩:主要就是dp的一种状态,与dp转移关系不大
位运算:\(a\&(a-1)\) 把a的最后一个1去掉

P10447 最短 Hamilton 路径

典题,每个点只能经过一次,所以只需要设 \(dp[s][j]\) ,s为哪些点已经访问过了状压的状态,j为现在在哪个点,状态转移方程显然

一本通题解

T1:

几种状压dp常见优化方式:
1.先把行内合法情况预处理出来
2.可以用& O(1) 比较两个串的基本情况

T3:

三进制我们先预处理出所有本位合法的情况,再预处理出行间两个状态比较是否合法这样可以优化掉一些复杂度

然后按照三进制存状态和转移即可

状压的精髓就在于,不需要两个状态按位比较,如果两个状态没法 \(O(1)\) 判断是否合法,也就失去了状压的意义

注:写题时,不小心把状态由0开始写成了从1开始,但是竟然拿到了90pts,我当时很惊讶,但是一想,是因为当m!=1时,0状态是不合法的

T4:

我们存一下上两位的状态进行转移,然后枚举第i位,i-1位,i-2位判断合法并转移,转移的话,预处理出本位合法状态和每种状态对应的1的个数即可

观察复杂度,\(2^10=1024\) 你会发现:啊?\(2^{m^3}n\),跑满的话 \(1e11\) !

但是你会发现有些情况并不合法,考虑本位合法情况

你可用一个递推来求出合法情况 \(f[i]=f[i-1]+f[i-3]\)

同时也可以采用打表的方式,你会发现,就算所有位置都可以摆炮兵,最多也只有60种合法情况!

最终复杂度 \(O(60^3*100)=O(2e7)\),轻松跑过

T5:

之前见过相似的trick,但还是没有考虑的很全面

我们考虑只需要通过一个状态的子集转移过来即可,所以对于对于每一种状态暴力枚举子集,具体方法就是 \(j=i\&(j-1)\),枚举所有的j就是i的子集,然后复杂度是 \(3^n\) 我之前证明过,忘了怎么证了。。。

T6:

先预处理出所有关键点+起点到任意点的距离,然后就很简单了,对关键点跑一遍旅行商问题即可

T7:

考虑设我们经过的点总和s1,边的总和s2,我们最终让s1/s2最小

然后我们考虑一件事情,就是选哪些点确定了,s1就确定了,我们让s2最大化就可以了

所以状压还是存一下选哪些点,然后存的是选这些点能获得的边权最大值,然后注意最开始要将所有状态赋值位-inf,只有起点为0即可,因为这样能保证只能从起点出发

T8:

考虑我们用二进制存一下删掉哪些字母,然后我们就现预处理出每一个字串是否为回文串,然后我们枚举每一种状态,再枚举其子集,转移即可

标签:状态,状压,合法,子集,预处理,dp
From: https://www.cnblogs.com/zcxnb/p/18678447

相关文章

  • 单调队列优化dp
    一本通题解T2:再也不想碰这道题了。。。写了一下午。我们先设状态\(dp[i][j]\)表示前i个刷匠,考虑了前\(j\)个木板后所获得的最大价值(\(j\)个木板可以有空余)。然后枚举前\(i\)个刷匠,枚举每一条木板。对于一条木板可以此刷匠根本不刷,或不刷当前木板,状转方程:\[dp[i][j]......
  • LCS(递归/记忆化/dp)
    题目链接:https://leetcode.cn/problems/longest-common-subsequence/TLE暴力递归+记忆化版本(基于字符串长度无优化版本)//注意text1[i1-1]==text2[i2-1]classSolution{public:intdp[1000][1000];intlongestCommonSubsequence(stringtext1,stringtext2){......
  • 漏洞预警 | WordPress Plugin Radio Player SSRF漏洞
    0x00漏洞编号CVE-2024-543850x01危险等级高危0x02漏洞概述WordPress插件RadioPlayer是一种简单而有效的解决方案,用于将实时流媒体音频添加到您的WordPress网站。0x03漏洞详情CVE-2024-54385漏洞类型:SSRF影响:获取敏感信息简述:RadioPlayer的/wp-admin/admin-......
  • 【韩国汉阳大学主办】第六届土木建筑及灾害防控国际学术会议暨第三届智慧城市建筑与基
    第六届土木建筑及灾害防控国际学术会议暨第三届智慧城市建筑与基础设施耐久性国际学术会议(CADPC&DuraBI2025)20256thInternationalConferenceonCivil,ArchitectureandDisasterPreventionandControl&3rdInternationalConferenceonDurabilityofBuildinga......
  • 斜率优化DP
    斜率优化DP例题HNOI2008玩具装箱朴素dp设\(dp_i\)表示前\(i\)个物品,分若干段的最小代价。状态转移方程为:\[dp_{i}=\min_{j<i}\left\{dp_{j}+\left(i-(j+1)+s_{i}-s_{j}-L\right)^{2}\right\}=\min_{j<i}\left\{dp_{j}+\left(s_{i}-s_{j}+i-j-1-L\right)^{2}\right\}......
  • 三大主流国际课程IBDP、AP、A-Level的区别是什么?-季遇教育
      最近咨询季遇老师的有不少孩子就读双轨制的学校的家长,还有很多想要体制内转轨的家长,都会问到如何选择合适的国际课程。今天就给大家介绍一下三大主流课程的区别!  IB课程  IB一共分为四个学段:IBPYP(小学)、IBMYP(初中)、IBDP(高中)、IBCP(职业教育)四个学段,其中IBDP......
  • CSP2025 - 树形 DP
    CSP2025-树形DPT1「MXOIRound1」城市这个“树上两点距离之和”很典,让我们想到换根DP。首先求出\(\text{siz}_u\)和\(d_u\),分别表示子树\(u\)的大小和子树所有点到\(u\)的距离之和。接下来求出整棵树的所有点到\(\boldsymbolu\)的距离之和。考虑用\(d_u\)......
  • ThreadPool解析
    Thread_Pool项目解析简介ThreadPool是一个轻量级的C++线程池实现,旨在简化多线程编程。项目分析我们首先上github的项目地址:https://github.com/progschj/ThreadPool,然后克隆项目到本地。点开项目的ThrealPool.h文件,查看源码:#ifndefTHREAD_POOL_H#defineTHREAD_POOL......
  • 树型DP
    ##树型DP**树型DP**,即在树上做动态规划。树是无环图,顺序可以是从叶子到根节点,也可以从根到叶子节点。一般树型DP的特征很明显,即状态可以表示为树中的节点,每个节点的状态可以由其子节点状态转移而来(从叶子到根的顺序),或是由其父亲节点转移而来(从根到叶节点的顺序),也可是两者结合。......
  • LeetCode | 图文详细描述动态规划DP算法及经典题型
    本文将用简单直白的方式,从零开始带你掌握动态规划的精髓。你会发现:动态规划其实没那么难——它就是递归的“记性”版。状态转移方程不再玄学——从题目思路到实现,手把手教你推导。经典题型剖析——从“爬楼梯”到“背包问题”,全都有图、有代码、有思路。看完这篇文章,动态规划......