【状压DP】易懂讲解状态压缩/状态压缩DP

本文介绍了状态压缩动态规划(状压DP)的概念,包括它与一般动态规划的区别。文章通过TSP问题的最短Hamilton路径举例,展示了如何使用位运算进行状态压缩。此外,还探讨了二进制下不进位运算在解决起床困难综合症问题中的应用,并介绍了STL bitset在动态规划中的高效运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

状态压缩DP

状压DP 又叫集合动态规划。是以结合信息为状态的特殊的动态规划的问题。主要有传统集合动态规划基于连通性状态压缩的动态规划两种。

状压DP和一般的DP的区别

一般的DP:着眼于整体,从中提取出几个关键信息并以此划分阶段使得问题具备无后效性或最优子性质,然后根据已知的信息依次对各个阶段进行决策。 状压DP:如果一般的状态难以描述无后效性原则,或者信息不足无法决策,许多元素的状态都直接影响的决策,都需要被考虑到。所以给每个元素都开个数组来存是行不通的。于是状压DP应运而生,它可以对多个元素的状态进行压缩存储

状态压缩预备知识–位运算

位运算是一种速度非常快的基本运算。有很多种操作

算数左移(<<):左移一位,相当于该数乘以2x2^x2x 算数右移(>>):右移一位,相当于该数除以2x2^x2x
与运算(&):两数同一位都为111时结果为111,否则为000或运算(|):两数同一位都为000时结果为000,否则为111
非运算(~):按位取反。例如~101=010

二进制状态压缩,是指将一个长度为mmmboolboolbool数组用一个mmm222进制整数表示并存储的方法。利用下列位运算操作可以实现原boolboolbool数组中对应下标元素的存取。(注意,为了不让优先级混乱,所以建议所有长运算都加括号)

取出整数nnn在二进制表示下的第kkk (n>>k)  &  1(n>>k)~~\&~~1(n>>k)  &  1
取出整数nnn在二进制表示下的第000k−1k-1k1 n&((1<<k)−1)n\&((1<<k)-1)n&((1<<k)1)
把整数nnn在二进制表示下的第kkk位取反 n xor (1<<k)n ~ xor ~(1<<k)n xor (1<<k)
对整数nnn在二进制表示下的第kkk位赋值111 n∣(1<<k)n|(1<<k)n(1<<k)
对整数nnn在二进制表示下的第kkk位赋值00
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值