浅谈状态压缩DP

本篇随笔简单讲解一下信息学奥林匹克竞赛中的状态压缩动态规划相关知识点。在算法竞赛中,状压\(DP\)是非常常见的动规类型。不仅如此,不仅是状压\(DP\),状压还是很多其他题目的处理技巧。所以掌握状压、掌握状压DP是十分重要的。

注:虽然自己写的也是状压DP的讲解。但还是凭良心推荐机房大佬@littleseven的状压博客,讲的真的是太详细了。强烈推荐!

链接Link:

浅谈状压DP

状态压缩的概念

来看一个问题。

相信大家都做过动态规划的背包问题,那么我们再来看一个跟背包很像的一个问题:

现在对于一个大小为\(V\)的背包,有\(n\)个物品,每个物品有一个价值和一个体积。请问:每种放置方法能达到的价值。

最暴力的方法是\(n\)重循环,每重循环只有两次,一个是判断,一个是不判断,复杂度是\(O(2^n)\)的。

但是这种方法并不是非常棒的,因为在编写程序的时候,循环的层数是确定的。但是\(n\)是一个变量,如果非要按这个方法写的话,就会有一堆判断(分别判断\(n=1,n=2,n=3,...,n=maxn\))的情况,麻烦得要死。

那怎么办呢?

我们可以发现:对于每一种方法中的每种物品,都只有选或者不选两种选择。这就是一个决策过程,因为我们要知道所有方式的价值,那我们莫不如用一个二进制数表示这个状态“选还是不选”,二进制数对应的位就表示这个物品选还是没选,然后在二进制基础上进行计算价值。

所以枚举范围就是\(0-2^n\),从一个都不选到全都选。

那么我们发现,原本需要开若干重循环和若干维数组的问题一下子变成了用一个数组和一重循环就解决的问题了。

这个把状态压缩的过程就叫做状态压缩,在存储状态的基础上进行枚举转移的动态规划就叫做状压DP。

状压DP的前置知识

因为状压是在二进制的基础上实现的一门DP算法,所以它一定会和位运算相关。事实上,所有状压\(DP\)都需要选手具有高深的位运算技巧,熟练运用位运算取出或设置每一个状态的判断条件和转移。

如果对位运算还不太懂的同学,请参考这篇博客:

详解位运算技巧

并且,我们要对动态规划的过程有一个直观的认知。

有了这些知识,理解状压\(DP\)才会更加流畅、顺利。

状压DP的性质及特点

通过刚才的例子(背包),我们会发现,状压对算法的时空复杂度并没有多少的优化,也就是说,它的本质其实是暴力枚举。

因为是暴力枚举,所以枚举每个状态的时间复杂度是\(O(2^n)\),这是一个指数级别的时间复杂度。高中数学必修一的函数部分告诉我们,指数是爆炸式增长的,也就是说如果不加优化,时间马上就会炸掉。所以基于这个性质,一般来讲状态压缩的题数据范围不会超过\(20\),数量比较小。而基于这个性质,我们设置状态的时候也就挑这个最小的数来设置。

状压DP的解题思路

先来看一道状压基础题(是洛谷蓝题,但是因为状压都比较难,所以不用发怵)

USACO Corn Fields玉米田讲解

题目大意:

给定一个\(N*M\)的矩阵,要在这个矩阵中种草,规定入股矩阵的值俄日1就可以中,反之就不行。现在给出这个矩阵,请问它有多少种猪矩阵的方案。数据范围:(\(1\le N,M\le 12\))

思路分析:

看见没,数据范围非常小,这样的题往状压上想一想。因为要统计方案数,所以我们的状态就设置成:\(dp[i][j]\)表示枚举到第\(i\)行,第\(i\)行的状态为\(j\)时的方案数。那么答案就是第\(n\)行的所有状态方案数的和。

刚刚我们已经说了,状压其实连优化枚举都算不上,它就是方便了我们写枚举的循环代码,对复杂度并没有多少贡献。基于这个性质,我们直接开始从头枚举,依次递推即可。

但事实没这么简单,因为我们还需要判断每个状态是否合法:如果不合法,那这个状态就不能进行枚举。

所以我们再想办法在转移的时候判断其到底合不合法即可。具体的实现请翻上面的题解。

总结:

状压\(DP\)算法的设计思路为:(敲黑板!!)

设计状态—>考虑转移的先决条件—>想办法维护这些条件—>进行转移—>统计答案。

状压DP例题

USACO Corn Fields玉米田

SCOI互不侵犯

NOI炮兵阵地

以上为基础状压DP,以下为状压DP进阶

CQOI解锁屏幕

SDOI学校食堂

浅谈状态压缩DP的更多相关文章

  1. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  2. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  3. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

  4. HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP

    题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...

  5. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

  6. 状态压缩dp问题

    问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...

  7. BZOJ-1226 学校食堂Dining 状态压缩DP

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...

  8. Marriage Ceremonies(状态压缩dp)

     Marriage Ceremonies Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu ...

  9. HDU 1074 (状态压缩DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...

随机推荐

  1. http请求报400错误的原因分析

     在ajax请求后台数据时有时会报 HTTP 400 错误 - 请求无效 (Bad request);出现这个请求无效报错说明请求没有进入到后台服务里: 原因:1)前端提交数据的字段名称或者是字段类型 ...

  2. Filter List Views 筛选器列表视图

    In this lesson, you will learn how to filter a List View. Three techniques, based on different scena ...

  3. Android8.1 MTK平台 SystemUI源码分析之 网络信号栏显示刷新

    SystemUI系列文章 Android8.1 MTK平台 SystemUI源码分析之 Notification流程 Android8.1 MTK平台 SystemUI源码分析之 电池时钟刷新 And ...

  4. Android8.1 源码修改之插入SIM卡默认启用Volte功能

    前言 公用电话产品,插入SIM卡后要求自动打开Volte功能,即插即用,用完拔卡就走 实现 第一步 开关对应的代码 通过打印日志和全局查找,源码位置 vendor/mediatek/proprieta ...

  5. C++ --const修饰指针

    const修饰指针 1.const修饰指针 (常量指针)常量的指针 const int *p = &a; const修饰的是*p(表示内容为常量),不是p(指针) 指针指向的地址可以改,但指针 ...

  6. 特殊权限SUID

    特殊权限SUID SUID : 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者: chmod u+s File chmod u-s File 如果 FileB本身原来就有执行权限,则S ...

  7. centos和Ubuntu系统最小化安装基础命令

    CentOS系统常用的基础软件如下 yum install vim iotop bc gcc gcc-c++ glibc glibc-devel pcre \ pcre-devel openssl o ...

  8. C# LINQ Join两个表连接,关联多个条件的写法

    1.sql语句: select * from Users u join Teachers t on u.UserID==t.TeacherID and u.Name=t.Name 2.linq写法: ...

  9. 基于V7的新版RL-USB V6.X + RL-FlashFS V6.X模板,操作CLASS10的SD卡速度12-15MB/S,含RTX5和FreeRTOS两版

    说明: 1.如果需要RL-USB源码的话,将DAPLink(CMSIS-DAP)里面的USB代码导出来即可,DAPLink开源了RL-USB的Device代码.      也可以反过来,在工程模板的基 ...

  10. Git实用指南

    个人整理的一些Git概念和命令,可以速查或者快速解决某些方面的问题 一.精简入门 1.克隆仓库 克隆仓库会下载仓库完整的文件.分支和历史记录 git clone [<options>] [ ...