状压DP——二进制的妙用

作者: 信息学小屋 | 来源:发表于2020-05-13 23:58 被阅读0次

之前我们讲解了背包问题、树形DP,区间DP这三类问题。这些都是中规中矩的动态规划题目。今天,我为大家讲解一种比较有趣、比较容易辨别的动规问题——状压DP。
状压DP,非常容易理解,就是在状态比较多的情况下,同时状态只需要记录是或非,使用二进制将其压缩,从而达到缩减时间复杂度的效果。
由于要使用二进制来表示状态,所以这类问题的数据范围会相对较小,时间复杂度经常含有 2^N ,故容易辨别(但是别把纯正的搜索题想成DP哦)。
下面,我通过几道例题来深入讲解一下状压DP(例题来源洛谷,侵删)。

洛谷P1433

Problem

观察题目发现,n最大只有15,很显然的状压DP。
我们用15位二进制数来表示奶酪的状态。换句话说,第i位二进制位如果是1,表示第i个奶酪已经被吃掉了;否则表示第i个奶酪还没被吃掉。
通过一个15位的二进制数,我们已经把奶酪的状态表示出来了,那么我们还需要什么数据才能实现递推呢?我们考虑吃奶酪的过程,吃完一个奶酪和到下一个奶酪的地方去的这个过程,我们只需要知道当前吃的奶酪是哪一个,和之前已经吃过的奶酪的顺序是没有关系的。
通过分析,这道题的解法已经很显然了,我们定义f[i][j]表示当前已经吃掉的奶酪的状态为i,最后吃的奶酪是j,转移方程如下:


动规方程

洛谷P1433

Problem

这是一道计数类问题,每块土地分为种了或没种,且数据范围较小,所以判断这是一道状压DP的题目。
按照套路,接下来要设计状态。 我们发现如果把整个矩阵(题目种农夫的地可以当成一个n*m的矩阵)进行压缩,那显然是压不了的。考虑矩阵中的一行,我们发现这行只受到它上下两行的限制(如果存在的话)。那么,我们如果从上往下DP,一行的状态就只受到它上一行的限制。这样我们就能DP了。 定义f[i][j]表示当前在处理第i行,上一行的状态为j,转移方程如下:

动规方程

这道题还有一个要注意的点就是初值的设置:


初始化

总结:状态DP的关键点在于如何对状态进行压缩、选择何种状态进行压缩。
现在很多的题目都不是单独的一种DP类型,而是在DP上继续做文章,如通过数据结构优化时间复杂度等等,我将会在后续的文章中给出动态规划的综合题,帮助大家掌握动态规划题目。

【信息学竞赛从入门到巅峰】,一个专注于分享OI/ACM常用算法及知识的公众号。

相关文章

  • 状压DP——二进制的妙用

    之前我们讲解了背包问题、树形DP,区间DP这三类问题。这些都是中规中矩的动态规划题目。今天,我为大家讲解一种比较有...

  • 状压DP

    最短Hamilton路径 原题链接[https://www.acwing.com/activity/content...

  • DP训练——状压DP

    状压DP BZOJ1087题意在的棋盘里面放个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以...

  • 状压DP系列

    几点注意: 1.数组下标从1开始比较方便 zoj Easy 2048 Again保存状态的时候是保存下降子序列的情...

  • LeetCode 状压dp

    5639. 完成所有工作的最短时间[https://leetcode-cn.com/problems/find-m...

  • 状态压缩和状压DP

    问题:n*n的棋盘放置n个点,保证每一行,每一列都有且只有一个点,有几种放置方式? 一、组合数解法:ans=n!二...

  • POJ 3311 floyd+压状DP

    poj3311因为这道题 点N 不超过10 可以 把状态转化 为 二进制数,0表示没经过这个点,1表示经过这个点。...

  • HDU-5816 状压DP [2016多校]

    桌面有N张A型牌,M张B型牌,目前玩家可抽一张牌(盲抽),若抽到A牌则可再抽两张,若抽到B牌,则可减少对方若干生命...

  • (状压dp)1655. 分配重复整数

    1655. 分配重复整数[https://leetcode-cn.com/problems/distribute-...

  • 图论(2)-从动态规划到网络流

    今天这期对LC比赛来说有点超纲。因为一般LC出这类题的话,你能够用状压DP或者其他手段去解决的。而网络流是能够处理...

网友评论

    本文标题:状压DP——二进制的妙用

    本文链接:https://www.haomeiwen.com/subject/mfganhtx.html