【知识】 状态压缩动态规划 & 【题解】 P10447 最短 Hamilton 路径
前言
在洛谷题解提交晚了一步,没通过。
思路
题意简述:题面已经够简了。
算法:状态压缩动态规划模板。
啥是状态压缩?我不会!
慢慢听我讲嘛。
状态压缩:将复杂状态压缩为整数来达到优化转移的目的。
对于这道题,每个点只有走过和没走过两种情况,所以我们用二进制数就能解决。
对于一个二进制数,如果从左往右第
比如对于二进制数
二进制数 | ||||||||
---|---|---|---|---|---|---|---|---|
对应位数 |
例如:
从右往左第
位上是 ,就说明 号点走过了。 从右往左第
位上是 ,就说明 号点还没走过。 以此类推……
那如何进行二进制数的操作呢?
首先你得知道位运算 。
判断集合
中是否含有 点: 1
if((S>>i)&1)
求集合
去除 点后的集合: 1
S^(1<<j)
枚举集合
中的所有点: 1
2
3for(int i=0;i<=n;i++)
if((S>>k)&1)
……
原理不难理解,请读者自行推导。
状态转移
这个和最短路的思路有点像。对于
枚举状态
状态转移方程:
那么我们最终的答案就是
代码实现
1 |
|
其他
状态压缩不仅可以压缩成二进制,如果题目中一个元素(点)可以有
- 标题: 【知识】 状态压缩动态规划 & 【题解】 P10447 最短 Hamilton 路径
- 作者: Xlon WU
- 创建于 : 2024-08-28 11:30:00
- 更新于 : 2024-09-23 18:53:17
- 链接: https://xlon-wu.top/2024/08/28/solution-luogu-p10447/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论