浅谈状态压缩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. 某酒店建筑设计CAD施工图

    本素材为某酒店建筑设计CAD施工图,其中包涵的有酒店室内装修图纸.各个标间房屋改造图以及酒店场外建筑施工图.其中图纸的格式都是为dwg格式的.想要查看图纸就可以使用CAD看图软件来进行查看.以下就是一 ...

  2. 成套销售交货组与BOM 546719 - FAQ: Delivery group and BOM in the delivery

    交货组:将需要同时交互给客户的项目捆绑在一起,按行项目中最后交货日期做完交货组的计划行日期 1.如果销售订单标记为完全交货,则所有行项目都会分配到同一个交货组中 删除交货单是会给出警告 2.为母键行项 ...

  3. swift冒泡排序,swift快速排序,swift归并排序,swift插入排序,swift基数排序

    import UIKit /// 冒泡 /// ///时O(n2),空O(1) 稳定排序 func Mysort(arr:[Int]) -> [Int]{ var transArr = arr ...

  4. 编译原理之DFA最小化,语法分析初步

    1.将DFA最小化: 状态转换图: 识别语言:b*ac*(da)*bb* 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→0S|0 (1)正规式: S -> 0(1S+ ...

  5. 文件迁移到FileTable中

    看此文档前,先参考一下文档 https://blog.csdn.net/downmoon/article/details/24374609 环境:阿里云ECS SQL Server 2017 + De ...

  6. robotframework框架 - 利用RequestsLibrary关键字轻松实现接口自动化!

    robotframework(后续简称为robot)是一款自动化测试框架,可能做各种类型的自动化测试. 本文介绍通过robotframework来做接口测试. 第一步:安装第三方库,提供接口测试的关键 ...

  7. 阿里云搭建wordpress博客教程

    一 :搭建环境 1.安装Apache环境 在线安装Apache yum install httpd 启动Apache服务 service httpd start 设置开机自启动 chkconfig h ...

  8. Yii2 中常用的增删改查操作总结

    一.新增 1.使用save() $model = new User(); $model->name = 'test'; $model->phone = '13000000000'; $mo ...

  9. 前端笔记之微信小程序(一)初识微信小程序&WXSS与CSS|WXML与HTML的差异&像素和DPR

    一.小程序概述 2017 年 1 月 9 日小程序正式上线,腾讯开放了个人开发者开发小程序,小程序从此就开始火爆,这一年,小程序狂揽 4 亿用户.1.7 亿的日常活跃,上线 58 万个.这是一个巨大的 ...

  10. easyui treegrid数据重复加载问题

    在使用easyui的时候,出现了数据重复加载的问题.如下图 关于这个问题有两种说法,第一种说法是 easyui-datagrid 类在html和js中重复定义,数据渲染时会加载两次.另一种是$(&qu ...