论状态压缩dp

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,而且要求不重复不遗漏
这些直接都给出,是不好理解的
所以我先给出了不优化做法
本文作者是蒟蒻,如有错误请各位神犇指正

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值