1前言
本文将介绍状压dp,前置知识少,会二进制和dp就行
保证从零开始
本文将会从hamilton路径问题引入,约等于题解
2问题
给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1 的最短 Hamilton 路径。
Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰好一次。
第一眼看成了最短路,但是要经过每个点,难办
但是,数据范围n<=18,这么小!但是怎么做,好像暴搜会TLE
可以考虑dp一下,但是状态怎么设置
3动态规划
我们可以考虑整一个dp[i]
为当前在i点
但是可以发现,当前在i点时,经过的点不一样,所以还要标记经过的点,是要到二维的
这怎么办啊,难道要用结构体开个bool数组?
4状态压缩优化
bool数组,只有01,那不就可以开个int来存一个二进制数了吗
我们把dp[i][j]表示目前到i点
j分解为二进制后,假设为101011
那么第0,1,3,5个点被经过了
状态表示完了,转移方程就好说
dp[s1][i] = max(dp[s1][i],dp[s2][j]+dist[s2][s1])
就是少一个1的状态加上路径长度
附代码,代码中的i,j反过来,是大家习惯的写法
5树状数组再优化
看代码,枚举i,j有点浪费时间,可以用树状数组优化,预处理然后lowbit直接用
但是这是大可不必的
你都状压了,还要什么时间复杂度?
而且思路与本题无关,不在详细阐述
6后记
学状压dp的时候,人们总是把它当做一种很新的dp
但是我发现洛谷中,状压dp的标签在dp优化里
我继续研究,发现真的是优化
本文例题讲的是状态压缩图上dp,因为易于理解
其实像是线性,区间,树形dp都可以优化的
所谓状态压缩,就是把原来需要单开一维的状态用二进制优化
适于解决的问题,数据极小不会大于20,而且要求不重复不遗漏
这些直接都给出,是不好理解的
所以我先给出了不优化做法
本文作者是蒟蒻,如有错误请各位神犇指正