zoukankan      html  css  js  c++  java
  • 模板:插头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

  • 相关阅读:
    How to get IWin32Window for Show/ShowDialog in Excel
    SSL 改变端口 ReportViewer 超级慢
    RportViewer(20121023) 参数引起的异常
    IKVM.NET[Java to C#]
    knockoutjs(03) ko + jquery ui
    我的四色
    vsto to fill data use listobject fill
    sinsspp 插件和主题安装
    自动化测试
    HTTP Error 500.19
  • 原文地址:https://www.cnblogs.com/luyouqi233/p/8256778.html
Copyright © 2011-2022 走看看