模板:插头dp
前言:
严格来讲有关dp的都不应该叫做模板,因为dp太活了,但是一是为了整理插头dp的知识,二是插头dp有良好的套路性,所以姑且还叫做模板吧。
这里先推荐一波CDQ的论文和这篇博客http://www.yhzq-blog.cc/%E6%8F%92%E5%A4%B4dp-%E4%BB%8E%E4%B8%8D%E4%BC%9A%E5%88%B0%E5%B4%A9%E6%BA%83/,下列一部分知识借鉴了他们的思想与内容。
————————————————————————
问题引入:
URAL1519:Formula 1
题目大意:给一个网格,有些网格有障碍,问有多少条哈密顿回路。
————————————————————————
概念引入:
插头dp:基于连通性状态压缩的动态规划。
插头:(对于本问题而言)一个格子可以与外面相连的边,显然通常是有上下左右四个插头。
轮廓线:已决策格子和未决策格子的分界线。
性质:
对于轮廓线上从左到右的四个插头abcd,如果a与c联通,则b与d一定不连通。
(可感性理解,也可对照论文看证明,证明并不难)
————————————————————————
在讲之前,我先阐述一下我对于插头dp的理解模型:水管游戏。
(本文会使用水管游戏的一些概念)
玩完了吧,是不是很好玩?好玩的话我们就正式开始学习插头dp吧。
(但是请注意一个水管只允许有两个口,和游戏中不一样)
(好了不要玩游戏了……)
————————————————————————
最小表示法:
首先定义连通性:如果两个格子的水管是相接的,那么称这两个格子是联通的。多个联通的格子组成了联通块。
这就给我们一种表示轮廓线当前状态的方法:f(i,j,S)表示逐格递推到(i,j)格的时候我们的状态为S,其中S中"0"代表无插头,否则均有插头,且数字相同的插头联通。
但是这样很慢(S的进制不是很优,无法常数优化,且可能造成多余的状态)
————————————————————————
括号表示法:
看一看那个结论,不觉得恨眼熟吗?是不是和括号很像啊?
括号表示法就是这样的方法:
我们令
0=无插头
1=左匹配插头"("
2=右匹配插头")"
(当然我们为了常数优化通常取四进制,这样就可以位运算了)
那么显然1与2配对的时候代表我们查到了一个联通块,且不能出现([)]的情况,所以这种表示方法得到的状态是唯一的。
它显然比上一种方法(在常数上)更优,所以我们可以采用这种方法的话一般采用这种方法。
(至于独立插头……emm……网上没有一个人写过这个……)
————————————————————————
实现:
实现蛮好想的,具体的算法构架如下:
1.模拟轮廓线移动。
2.枚举当前可能出现的所有状态。
3.对于新更新的格子,合并/分离/维持联通块。
4.将新状态更新为括号表示/最小表示法,存储。
存储的方法使用哈希表即可。
其中最关键(也是最复杂)的地方为3,但是由于作者懒,所以请参考文章开头提供的博客,那里有图文注释,比较容易能看懂。
————————————————————————
总结:
其实插头dp不难,但是在我想到用水管游戏解释插头之前我确实是mengbier,所以说这个东西就是理解起来困难,理解了就真的不难了。
强烈推荐先抄一个代码,大致实现一下插头dp,感性理解有助于接下来的做题。
(比如我的代码就是抄的那篇博客……)
例题:
最小表示法:
BZOJ2595:[Wc2008]游览计划:http://www.cnblogs.com/luyouqi233/p/8258525.html
括号表示法:
URAL1519:Formula 1:http://www.cnblogs.com/luyouqi233/p/8256801.html
BZOJ1187:[HNOI2007]神奇游乐园:http://www.cnblogs.com/luyouqi233/p/8260236.html
灵活运用:
BZOJ2331:[SCOI2011]地板:http://www.cnblogs.com/luyouqi233/p/8261279.html
模板:插头dp的更多相关文章
- 模板—插头dp(Ural 1519 Formula 1)
括号表示法: 据说比下一个要快而且灵活. #include<iostream> #include<cstring> #include<cstdio> #define ...
- 插头DP模板
/* 插头dp模板 抄的GNAQ 的 括号表示法 */ #include<cstdio> #include<algorithm> #include<cstring> ...
- bzoj1814 Ural 1519 Formula 1(插头dp模板题)
1814: Ural 1519 Formula 1 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 924 Solved: 351[Submit][Sta ...
- LG5056 【模板】插头dp
题意 题目背景 ural 1519 陈丹琦<基于连通性状态压缩的动态规划问题>中的例题 题目描述 给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? 输 ...
- P5056 【模板】插头dp
\(\color{#0066ff}{ 题目描述 }\) 给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? \(\color{#0066ff}{输入格式}\) 第1 ...
- 【模板】插头dp
题目描述 题解: 插头$dp$中经典的回路问题. 首先了解一下插头. 一个格子,上下左右四条边对应四个插头.就像这样: 四个插头. 一个完整的哈密顿回路,经过的格子一定用且仅用了两个插头. 所以所有被 ...
- 插头dp
插头dp 感受: 我觉得重点是理解,算法并不是直接想出怎样由一种方案变成另一种方案.而是方案本来就在那里,我们只是枚举状态统计了答案. 看看cdq的讲义什么的,一开始可能觉得状态很多,但其实灰常简单 ...
- hdu1964之插头DP求最优值
Pipes Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 插头dp初探
问题描述 插头dp用于解决一类可基于图连通性递推的问题.用插头来表示轮廓线上的连通性,然后根据连通性与下一位结合讨论进行转移. 表示连通性的方法 与字符串循环最小表示不同,这种方法用于给轮廓线上的联通 ...
随机推荐
- Python 函数修饰符(装饰器)的使用
Python 函数修饰符(装饰器)的使用 1. 修饰符的来源修饰符是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 修饰符是解决这类问题的绝佳设计, ...
- [egret]白鹭引擎打包安卓包体积太大减小
萌新第一次用egret打安卓包,发现裸包22M+,吃惊到吃手手. 上网搜查无果. 可能原因是egret优化过一波打包,变得更便利了,网上对新版本打包比较少讨论. 解决方法: egret-android ...
- React Native移动开发实战-2-如何调试React Native项目
在实际开发中,还有一个影响开发效率的重要因素:调试. 在1.4.3节中已经介绍了Enable Live Debugger的使用.本节来介绍另一个非常重要的调试选项:Debug JSRemotely选项 ...
- 随手记录-linux-Shellinabox插件
Shellinabox 是一个利用 Ajax 技术构建的基于 Web 的远程Terminal 模拟器,也就是说安装了该软件之后,不需要开启 ssh服务,通过 Web 网页就可以对远程主机进行维护操作了 ...
- Django_rest_framework_基础
简介 为什么要使用REST framework? Django REST framework 是一个强大且灵活的工具包,用以构建Web APIs. - 在线可视的API,对于赢得你的开发者们十分有用 ...
- JavaWeb项目通过调用cmd实现备份数据库的功能
1.别急着上车,先测试一下能否成功调用cmd,可以尝试通过cmd命令打开计算器,代码如下: 2.能成功打开计算器后,证明调用cmd的方法是没错的,现在把cmd命令字符串改成我们备份数据库的 命 ...
- Daily Scrum (2015/10/30)
据组员们反映其他组都会有休息时间,所以我和PM讨论把每周5晚上作为日常休息时间,这一天组员们自由阅读.
- Java试验四
北京电子科技学院(BESTI) 实 验 报 告 课程: Java 班级:1352 姓名:朱国庆 学号:20135237 成绩: ...
- iOS开发学习-nonatomic和atomic的区别
nonatomic是非原子性的,也就是给线程不加原子锁,这样的代码运行效率会更高一点,例如: @property (nonatomic,copy)NSString *userName; @proper ...
- Task 6.4 冲刺Two之站立会议4
今天对主界面部分的代码进行了完善,因为主界面有对于用户账号的设置.包括头像修改.增删好友.进入聊天界面等功能,包含的内容很多.我主要是负责跟聊天界面的连接以及账号设置的部分:遇到的问题有,因为这部分依 ...