题意:给一个n*m的矩阵,每个格子中有1个数,可能是0或2或3,出现2的格子数为2个,出现3的格子数为2个,要求将两个2相连,两个3相连,求不交叉的最短路(起终点只算0.5长,其他算1). 思路: 这题与普通插头DP有些区别了,就是要求最短路时,而且还要同时两条不相交的最短路.一开始看还是感觉挺难的,因为每个0格子还得考虑两种线,分别是2线和3线,而且还不能出现回路的,于是就想用之前的模板,括号表示法,再加上1个位来表示2/3线,即共3个位来表示一个插头信息,但是写了才发现,括号表示不了,比如仅…
http://poj.org/problem?id=3133 考虑插头 dp 用四进制表示一个插头的状态,0 表示没有插头,2 表示这个插头是连接两个 2 的,3 同理 然后就是大力分类讨论了 这题还是比较友善的一题,思路相对来说简单很多 我写的括号序列的方法状态是满的,数组必须开到 $ 3 ^ 9 $ 才能过 #include <cstdio> #include <cstring> #include <algorithm> #define CIOS ios::sync…
There is a rectangular area containing n × m cells. Two cells are marked with “2”, and another two with “3”. Some cells are occupied by obstacles. You should connect the two “2”s and also the two “3”s with non-intersecting lines. Lines can run only v…
http://poj.org/problem?id=3133 题意:n×m的网格,有2个2,2个3,他们不会重合.还有障碍1.现在求2到2的路径和3到3的路径互不相交的最短长度-2.(2<=n,m<=9) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct H { static const int M=1000007; struct E {…
题目链接 明明是道状压dp的题我为啥非要用插头dp乱搞啊 逐行枚举,设dp[i][S]为枚举到第i个格子时,状态为S的情况.S为当前行上的“插头”状态,每两个二进制位表示一个格子,设当前格子为(x,y),则y之前的插头表示左插头,y之后的插头表示上插头,仅当当前格子上没有插头时才能够放置炮兵.转移的大致流程为:枚举当前状态->判断是否可放置炮兵->更新右插头状态->更新上插头状态. 跑的速度还可以,虽然略输于状压dp.如果合法状态数不是那么少的话,可能会比状压dp要快. #include…
Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 2745   Accepted: 1345 Case Time Limit: 2000MS   Special Judge Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material s…
题意:给定一棵n个节点的树,要在某些点上建设消防站,使得所有点都能够通过某个消防站解决消防问题,但是每个点的建站费用不同,能够保证该点安全的消防站的距离上限也不同.给定每个点的建站费用以及最远的消防站距离上限,求保证该树安全的最小花费. 思路: 要选择部分点来建站解决消防问题,而总花费是有最优解的. 如何进行树形DP? 假设某点t的所有子树的消防问题都解决,而且已经获得最优解了,那么现在考虑的是点t的最优解问题,点t可以依靠任何点只要不超过距离限制即可,那枚举一下所有点试试,一旦t依靠某个点j解…
建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议先理解“插头”的概念.然后会HASH表(这个其实是很基础的东西,应该都会的).然后就是DP. 以及特殊题目的特殊处理. 好像一般是求N,M<=12的网格图的某种回路数或某种通路数的方案数. 大体上每个题说几句特殊处理,有问题请纠正....题目的顺序基本上难度递增 另外代码我都是用括号匹配的.因为感觉连通…
题目描述 题解: 插头$dp$中经典的回路问题. 首先了解一下插头. 一个格子,上下左右四条边对应四个插头.就像这样: 四个插头. 一个完整的哈密顿回路,经过的格子一定用且仅用了两个插头. 所以所有被回路经过的格子有六种状态,即左上,左右,左下,上右,上下,右下. 这几个就是插头$dp$的基本. 然后我们来了解一下轮廓线. 红线就叫轮廓线. 我们可以利用轮廓线作为状态dp,将轮廓线一点点右推+下推,直到推完,这样我们就可以得出全局答案啦!!! 但是怎么转移…… 插头! 我们可以稍微讨论一下,讨论…
Description 题目大意:给你个N x M(1≤N, M≤9)的矩阵,0表示空地,1表示墙壁,2和3表示两对关键点.现在要求在两对关键点之间建立两条路径,其中两条路径不可相交或者自交(就是重复经过同一格子),并且不能经过墙壁,路径只能从一个格子走到相邻的下一格子.求两条路径最少需要经过的格子数减二.如果不存在解,输出0. Solution 插头DP,用三进制来表示轮廓线,0表示没有插头,1表示"2"的的插头,2表示"3"的插头 对于0的格子:00 ->…
题意:给一个n*m的矩阵,其中#是障碍格子,其他则是必走的格子,问从左下角的格子走到右下角的格子有多少种方式. 思路: 注意有可能答案是0,就是障碍格子阻挡住了去路. 插头DP有两种比较常见的表示连通信息的方式: (1)最小表示法 (2)括号表示法 本文用括号表示法实现.左括号为1,右括号为2,用两个位来表示.轮廓线上最多需要表示9个插头信息,那么就是18个位即可.插头的状态转移有如下几种: (1)右插头和下插头都是同个方向的括号,则合并他们,再将对应的两外两个半括号给改成一对.比如 ((())…
[题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出来. 加了点优(gou)化(pi),然后poj上1244ms垫底. 大概的方法就是考虑每一层横着放的情况,剩下的必须竖起来的情况到下一层取反即可. 然后看了 <插头DP-从入门到跳楼> 这篇博客,怒抄插头DP 然后16ms了,自己慢慢YY了一下,写出了风(gou)流(pi)倜(bu)傥(tong)…
题目链接: http://poj.org/problem?id=2411 Mondriaan's Dream Time Limit: 3000MSMemory Limit: 65536K 问题描述 Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series' (where he had…
//插头DP,算是广义路径的吧. /* 我是这样想的,定义填数的为0,未填的为1.然后,初始自然是(0,0).我还定义了整个棋盘的状态,不知是否多此一举. 这样,把轮廓线上的格子状态记录.当(I,J)上方的格子为空,必定要填一个竖的.当左边格子为空,当前可填一个横的,也可不填. 当左边格子不为空,当前格子必为空...AC. */ #include <iostream> #include <cstdio> using namespace std; int n,m; ]; ; ; st…
看到题目显然是插头\(dp\),但是\(n\)和\(m\)的范围似乎不是很小.我们先不考虑复杂度设一下状态试试: 一共有三个连通分量,我们按照\(1,2,3\)的顺序来表示一下.轮廓线上\(0\)代表没有插头接入,\(x\)说明有第\(x\)个连通分量里的插头接入,需要在这里连下去. 我们设当前格子左边的一位轮廓线为\(b_1\),上边的一位轮廓线为\(b_2\). 如果\(b_1 = b_2 = 0\): 当前格子可以选择不放. 当前格子也可以向下新建一个\(L\). 如果\(b1 = 0\)…
亲手写掉的第一道最小表示法!哈哈哈太开心啦~ 不同于以往的几个插头\(dp\),这个题目的轮廓线是周围的一圈\(n\)个格子.而其所谓"插头"也变成了相邻格子的所属连通分量编号,并不是直接把前面几个题的思想往上套就可以轻松解决的了.这里我们就要采用一种叫最小表示法的东西来表示它的连通性信息啦~ (其实感觉是不是称之为逐格递推的轮廓线\(dp\)比较好... 而最小表示法是什么呢?举个例子,现在有这样一个序列\((5,5,3,2,4,1,3,2)\),序列中的每一个数代表第\(i\)个格…
真的是个好(毒)题(瘤).其中枚举的思想尤其值得借鉴. \(40pts\):插头\(dp\),记录插头的同时记录每一列的连接状况,复杂度\(O(N*M*2^{n + m} )\). \(100pts\):容斥\(+\)插头\(/\)轮廓线.目前要维护每两行和每两列的限制,我们把两个限制分开讨论.预处理一下每个子矩阵如果不作限制的可行方案,然后人为地进行限制分割.对于列的限制用容斥解决,对于行的限制套在里面逐行枚举做一次\(dp\),就可以把复杂度降到可以接受的\(O(m^3*2^n)\). 代码…
想当初,我听见大佬们谈起插头DP时,觉得插头DP是个神仙的东西. 某大佬:"考场见到插头DP,直接弃疗." 现在,我终于懂了他们为什么这么说了. 因为-- 插头DP很毒瘤! 为什么? 等等你就知道这是为什么了. 例题 hdu 1693 Eat the Trees 题目大意:给你一个地图,每个格子是空地或者障碍.现在要用若干个回路来覆盖这些空地,使得每个空地皆被一个回路覆盖.问方案数. n,m<=11 How to solve it? 暴力?本人的暴力水平太弱了,对于这题,似乎连暴…
集中做完了插头$dp$ 写一下题解. 一开始学的时候还是挺蒙的. 不过后来站在轮廓线$dp$的角度上来看就简单多了. 其实就是一种联通性$dp$,只不过情况比较多而已了. 本来转移方式有两种.逐行和逐格转移. 不过逐行转移因为分类太多所以被舍弃了. 一般的插头$dp$采用逐格转移. 插头表示已经进入当前格子的状态,而并不是将要进入的状态. 状态的表示方式常见的有两种:最小表示法和括号表示法. 括号表示法不如说是广义括号表示法的特殊一种情况,每个插头也就是左右括号就是表示两个相匹配的回路部分,而最…
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样,并且有不少的分类讨论,让插头DP十分锻炼思维的全面性和严谨性. 下面我们一起来学习插头DP的内容吧! 插头DP主要用来处理一系列基于连通性状态压缩的动态规划问题,处理的具体问题有很多种,并且一般数据规模较小. 由于棋盘有很特殊的结构,使得它可以与“连通性”有很强的联系,因此插头DP最常见的应用要数…
简介 插头DP(轮廓线DP)是用来解决网格图回路问题的一种算法. 插头DP解决的经典问题就是统计经过所有格子的哈密顿回路条数,某些格子有障碍. ​ 如果问题稍微进阶一点的话,不一定要求路径是回路.路径带权等等情况都可能出现. ​ 它的时间复杂度比较高,但是已经属于比较高效的算法了. 基本概念 ​ 首先看经典问题:统计一个带障碍的\(n*m\)网格中\((n,m\le 12)\),经过所有格子的哈密顿回路的条数. 插头DP的状态围绕轮廓线进行转移. 我们的状态是\(f(i,j,state)\),表…
http://poj.org/problem?id=3133 (题目链接) 题意 $n*m$的网格里有空格和障碍,还有两个$2$和两个$3$.要求把这两个$2$和两个$3$各用一条折线连起来.障碍里不能有线,而每个空格里最多只能有一条线,也就是说两条折线不能相交,每条折线不能自交.问两条折线的总长度最短是多少. Solution 插头dp. 类似于插头记录连通情况,我们这里的插头记录的是它属于那条折线.折线只有两条,所以插头的种类就三种:0(无插头),2(插头所在的直线是$2$所延伸出的直线),…
插头dp: \(A:\)插头dp是什么? \(B:\)一种基于连通性状态压缩的动态规划问题 \(A:\)请问有什么应用呢? \(B:\)各种网格覆盖问题,范围允许状压解决,常用于计算方案数与联通块权值 \(A:\)轮廓线与插头呢??? \(B:\)轮廓线是状压的部分,用于解决插头的情况,不同于常见的状压dp,为了更好地处理状态,通常要要到括号表示法.最小表示法等,插头是格与格中的转移,可理解成将拼图连接的位置 \(A:\)本文将讲解哪些类型的题目呢? \(B:\)单回路覆盖方案数,多回路覆盖方案…
[LA3620]Manhattan Wiring 试题描述 输入 输出 输入示例 输出示例 数据规模及约定 见“输入” 题解 我们把“连线”的过程改为“铺地砖”的过程,总共有 11 种地砖,每种地砖上的图案连接了两个不同的边界,或只触碰了一个边界,或没有图案,具体见下图: 其中,有障碍的格子只能铺 0 号砖,有数字 2 或 3 的格子只能铺 1 到 4 号砖,空地可以铺 0 或 5 到 10 号砖. 然后我们就可以轮廓线 dp 了,把状态表示成上一行的底部是否有线,这一行的底部是否有线,当前格子…
插头dp 感受: 我觉得重点是理解,算法并不是直接想出怎样由一种方案变成另一种方案.而是方案本来就在那里,我们只是枚举状态统计了答案. 看看cdq的讲义什么的,一开始可能觉得状态很多,但其实灰常简单 就像lyd说的,考插头dp的题目就是在考模板2333 (学这个之前连hash_map都没写过2333 WA: (1) 初始化矩阵,周围格子有可能是0--->转移出错 (2)统计答案最后统计的是合法的,即st==0的... 题目集锦: (1)cojs1512 经过所有可经过的点的一条回路个数 因为是一…
题目大意: 给定一个图,一部分点'*'作为障碍物,求经过所有非障碍点的汉密尔顿回路有多少条 基础的插头DP题目,对于陈丹琦的论文来说我觉得http://blog.sina.com.cn/s/blog_51cea4040100gmky.html 这个博客写的更容易理解,不过好像这篇博客里的代码有问题,反正是A不了题目的 不过上面的图和思路写的很清楚,可以作为参考 #include <cstdio> #include <cstring> #include <iostream>…
题目大意: 题目背景竟然是dota!屠夫打到大后期就没用了,,只能去吃树! 给一个n*m的地图,有些格子是不可到达的,要把所有可到达的格子的树都吃完,并且要走回路,求方案数 题解: 这题大概是最简单的插头dp了.. 比陈丹琦论文里的例题还要简单,因为允许有多个回路,所以不需要存储插头之间的连通性,直接二进制状压 搞清楚插头和轮廓线的概念基本就可以做出来了 这里有一些资料http://www.docin.com/p-741918386.html 代码: #include <iostream> #…
题目1:BZOJ 1814 URAL 1519 Formula 1 题目大意:给定一个N*M的棋盘,上面有障碍格子.求一个经过所有非障碍格子形成的回路的数量. 插头DP入门题.记录连通分量. #include <bits/stdc++.h> using namespace std; ; ; ; typedef long long ll; ll ans = ; int n, m; int maze[maxd][maxd]; int code[maxd], ch[maxd]; int end_x,…
基于联通性的状态压缩动态规划是一类非常典型的状态压缩动态规划问题,由于其压缩的本质并不像是普通的状态压缩动态规划那样用0或者1来表示未使用.使用两种状态,而是使用数字来表示类似插头的状态,因此.它又被称作插头DP. 插头DP本质上是一类状态压缩DP,因此,依旧避免不了其指数级别的算法复杂度,即便如此,它依旧要比普通的搜索算法快非常多. [例]Postal Vans(USACO training 6.1.1) 有一个4*n的矩阵.从左上角出发,每次能够向四个方向走一步,求经过每一个格子恰好一次.再…
因为这题,气得我火冒三丈! 这数据是不是有问题啊!我用cin代替scanf后居然就AC了(本来一直卡在Test 18)!导致我调(对)试(排)了一个小时!! UPD:后来细细想想,会不会是因为scanf的读入,数组要开大一点点呢?比如读一个长为$n$的字符串,需要一个$str[n + 1]$? 题目 就是找出有多少条经过所有可行格子的回路. 插头DP 一直没有时间学习,然后最近膜拜了一下cdq的<基于连通性状态压缩的动态规划问题>,然后写了一裸题. 其实也很好写嘛,不过在转移的时候要万分小心,…