前言:

严格来讲有关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的更多相关文章

  1. 模板—插头dp(Ural 1519 Formula 1)

    括号表示法: 据说比下一个要快而且灵活. #include<iostream> #include<cstring> #include<cstdio> #define ...

  2. 插头DP模板

    /* 插头dp模板 抄的GNAQ 的 括号表示法 */ #include<cstdio> #include<algorithm> #include<cstring> ...

  3. bzoj1814 Ural 1519 Formula 1(插头dp模板题)

    1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 924  Solved: 351[Submit][Sta ...

  4. LG5056 【模板】插头dp

    题意 题目背景 ural 1519 陈丹琦<基于连通性状态压缩的动态规划问题>中的例题 题目描述 给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? 输 ...

  5. P5056 【模板】插头dp

    \(\color{#0066ff}{ 题目描述 }\) 给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? \(\color{#0066ff}{输入格式}\) 第1 ...

  6. 【模板】插头dp

    题目描述 题解: 插头$dp$中经典的回路问题. 首先了解一下插头. 一个格子,上下左右四条边对应四个插头.就像这样: 四个插头. 一个完整的哈密顿回路,经过的格子一定用且仅用了两个插头. 所以所有被 ...

  7. 插头dp

    插头dp 感受: 我觉得重点是理解,算法并不是直接想出怎样由一种方案变成另一种方案.而是方案本来就在那里,我们只是枚举状态统计了答案. 看看cdq的讲义什么的,一开始可能觉得状态很多,但其实灰常简单 ...

  8. hdu1964之插头DP求最优值

    Pipes Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  9. 插头dp初探

    问题描述 插头dp用于解决一类可基于图连通性递推的问题.用插头来表示轮廓线上的连通性,然后根据连通性与下一位结合讨论进行转移. 表示连通性的方法 与字符串循环最小表示不同,这种方法用于给轮廓线上的联通 ...

随机推荐

  1. Babylon.js官方性能优化文档中文翻译

    在这里列出Babylon.js官方性能优化文档的中英文对照,并在CardSimulate项目里对其中的一些优化方法进行实践. How To 如何 Optimize your scene 优化你的场景 ...

  2. vue mock(模拟后台数据) +axios 简单实例(二)

    需装上axios,build文件夹中webpack.dev.conf.js文件添加上vue mock配置的东东,  如,继(一) //组件<template> <div> &l ...

  3. JavaScript学习笔记(八)—— 补

    第九章 最后的补充 一.Jquery简单阐述 JQuery是一个JavaScript库,旨在减少和简化处理DOM和添加视觉效果的JavaScript代码:使用时必须得添加库路径:学习路径:http:/ ...

  4. OpenFastPath(2):原生态Linux Socket应用如何移植到OpenFastPath上?

    版本信息: ODP(Open Data Plane): 1.19.0.2 OFP(Open Fast Path): 3.0.0 1.存在的问题 OpenFastPath作为一个开源的用户态TCP/IP ...

  5. ovs源码阅读--元组空间搜索算法

    关于TTS(元组空间搜索算法)的详细介绍可以参考OVS+DPDK Datapath 包分类技术这篇文章,本文只对该篇博客进行简单的介绍,案例和部分图片来自于OVS+DPDK Datapath 包分类技 ...

  6. 不用U盘,用一台好电脑给另一个电脑重装windows10

    先把坏电脑硬盘拆下来,然后挂到好电脑上 把这块盘用系统的磁盘管理工具改成GPT分区表格式,然后整盘分区(NTFS). 再对这个分区进行压缩卷操作,分出第二个区(FAT32格式 大小大于5G 我这里用了 ...

  7. 数据库之python操作mysql

    目录 一.pymysql 二.SQLAchemy 2.操作使用 (1)连接数据库 (2)执行原生SQL语句 (3)ORM操作-数据表操作 (4)ORM操作-数据行操作 (5)更多例子 一.pymysq ...

  8. Notes of Daily Scrum Meeting(11.5)

    Notes of Daily Scrum Meeting(11.5) 今天是我们学习学长代码,同时学习安卓语言的第三天.我们和学长沟通了一下,仔细讨论后得出一个结论,学长在 IOS平台上的代码可以借鉴 ...

  9. Linux 目录结构及文件基本操作

    Linux 目录结构及文件基本操作 实验介绍 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux ...

  10. js实现把一个页面层数据传递到另一个页面

    由于之前面试,被问到过此问题,所以今天特意整理了一下.由于自己技术水平有限,若存在错误,欢迎提出批评. 本博客整理了两种方式从一个页面层向另一个页面层传递参数. 一. 通过cookie方式 1. 传递 ...