省选算法学习-插头dp】的更多相关文章

插头dp?你说的是这个吗? 好吧显然不是...... 所谓插头dp,实际上是“基于连通性的状态压缩dp”的简称,最先出现在cdq的论文里面 本篇博客致力于通过几道小小的例题(大部分都比较浅显)来介绍一下这种思路清奇的dp是怎么回事 Part I 定义 何为插头? 插头实际上是一个代称,代指两个格之间的连通性 若dp的某一个状态中,有某相邻的两个格子是联通的(比如说处在同一条路径上.被同一个矩形覆盖blablabla),我们就认为这两个格子之间有插头 举个栗子,格子(1,1)和格子(2,1)联通,…
嗯......四边形不等式的确长得像个四边形[雾] 我们在dp中,经常见到这样一类状态以及转移方程: 设$dp\left[i\right]\left[j\right]$表示闭区间$\left[i,j\right]$中的最小值/最大值/和值 然后有这样的转移: $dp\left[i\right]\left[j\right]=min\left(dp\left[i\right]\left[k-1\right]+dp\left[k\right]\left[j\right]+w\left(i,j\righ…
于是乎,在丧心病狂的noip2017结束之后,我们很快就要迎来更加丧心病狂的省选了-_-|| 所以从写完上一篇博客开始到现在我一直深陷数据结构和网络流的漩涡不能自拔 今天终于想起来写博客(只是懒吧......) 言归正传. 省选级别的数据结构比NOIP要高到不知道哪里去了. noip只考一点线段树啊st表啊并查集啊之类的简单数据结构,而且应用范围很窄 但是省选里面对数据结构,尤其是高级数据结构的要求就高了很多,更有一些题目看着就是数据结构题,也没有别的做法. 因此掌握高级数据结构就成了准备省选的…
前置知识 首先你得会manacher,并理解manacher为什么是对的(不用理解为什么它是$O(n)$,这个大概记住就好了,不过理解了更方便做$PAM$的题) 什么是回文自动机? 回文自动机(Palindrome Automaton),是一类有限状态自动机,能识别一个字符串的所有回文子串 它可简化构建出回文树 回文自动机的构造 网上资料很多,不拿出来一步步说了,说一下数组意义.放个板子 $len[u]$表示节点$u$代表的回文串的长度 $ch[u][c]$代表在$u$的回文串两端添加字符$c$…
前置知识 扩展欧几里得,快速幂 都是很基础的东西 扩展欧几里得 说实话这个东西我学了好几遍都没有懂,最近终于搞明白,可以考场现推了,故放到这里来加深印象 翡蜀定理 方程$ax+by=gcd(a,b)$一定有整数解 证明: 因为$gcd(a,b)=gcd(b,a$ $mod$ $b)$ 所以假设我们已经求出来了$bx+(a$ $mod$ $b)y=gcd(b,a$ $mod$ $b)$的一组整数解$(p,q)$ 因为$a$ $mod$ $b=a-(\lfloor \frac{a}{b} \rflo…
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样,并且有不少的分类讨论,让插头DP十分锻炼思维的全面性和严谨性. 下面我们一起来学习插头DP的内容吧! 插头DP主要用来处理一系列基于连通性状态压缩的动态规划问题,处理的具体问题有很多种,并且一般数据规模较小. 由于棋盘有很特殊的结构,使得它可以与“连通性”有很强的联系,因此插头DP最常见的应用要数…
我们今天来学习插头DP??? BZOJ 2595:[Wc2008]游览计划 Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点: 否则表示控制该方块至少需要的志愿者数目. 相邻的整数用 (若干个) 空格隔开, 行首行末也可能有多余的空格. Output 由 N + 1行组成.第一行为一个整数,表示你所给出的方案 中安排的志愿者总数目. 接下来 N行,每行M 个字符,描述方案中相应方块的情况: z '_'(下划…
前言: 严格来讲有关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…
[题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表示无插头,1表示能拐弯的插头,2表示不能拐弯的插头.(有插头,方块就必须必须延伸到该格),考虑转移即可. 注意可以凭空产生一个能拐弯的插头. n*m<=100,当m>10的时候将i,j互换. #include<cstdio> #include<cstring> #inclu…
题目链接:https://vjudge.net/problem/URAL-1519 1519. Formula 1 Time limit: 1.0 secondMemory limit: 64 MB Background Regardless of the fact, that Vologda could not get rights to hold the Winter Olympic games of 20**, it is well-known, that the city will co…
[题意]给定m*n的整数矩阵,求经过所有点至多一次路径的最大数值和.n<=8,m<=100. [算法]插头DP [题解]最小表示法确实十分通用,处理简单路径问题只需要状态多加一位表示独立插头的数量0~2(即路径端点),转移的时候多考虑凭空产生独立插头和结尾为独立插头的情况即可. 可以跳格的情况直接转移就行.求最值路径和求路径数的区别就是把加改成乘.这样每行至多5种联通编号,用8进制即可. #include<cstdio> #include<cstring> #inclu…
[题目]1519. Formula 1 [题意]给定n*m个方格图,有一些障碍格,求非障碍格的哈密顿回路数量.n,m<=12. [算法]插头DP [题解]<基于连通性状态压缩的动态规划问题> by CDQ(万恶之源T_T) 如果你想学最小表示法,当然首推kuangbinの博客. 基本思想是逐格推进,维护轮廓线的m+1个插头的状态,每个插头有一个编号,连通的插头编号相同. 由于只转移和记录有效状态,所以时空复杂度都大大优于普通的状压DP. 1.存储:容易发现连通编号至多0~6,所以用数字每…
邮递员想知道,如果他每天都用不同路线走过10×20个点阵邮筒,他必须活过多少个世纪才能走遍所有方案? 7:00 改完T1,开始肝插头dp 7:10 放弃,颓博客 7:20 学习插头dp 7:21 放弃,抄代码 8:30 抄完结构体,负罪感强烈,自打分类讨论 从此 0分:打了一个分类讨论就把它复制粘贴到另一个类似的分类讨论里,改都不改... 0分:为了避免hash出负,行间转移时将状态&full  结果不小心把最高位那个有用的信息舍弃了... 0分:link函数出锅,根本没考虑全所有的情况,也就是…
插头\(DP\)学习小结 这种辣鸡毒瘤东西也能叫算法... 很优秀的一个算法. 最基本的适用范围主要是数据范围极小的网格图路径计数问题. 如果是像\(Noi2018\)那种的话建议考生在其他两道题难度超过普及组的情况下放弃这题. 其实大佬想做也可以去刚一下 切记如果在考场上看到这种题目,千万不要觉得你看出正解就是切了此题. 请一定将插头\(DP\)题当做一道毒瘤大模拟看待. 要点 这种东西细节挺多的,如果是比较灵活的题目那些转移一定都要好好考虑清楚,尽量做到一次过,否则调试时间可能会爆炸. 目前…
基于连通性的状压DP问题. 一般是给你一个网格,有一些连通性的限制. 例题 插头DP模板 链接 题意:网格图,去掉一些点,求哈密顿回路方案数. 一般按格递推(从上到下,从左到右). 每个格子要从四个方向中选两个作出边. 我们只需要记录红色的轮廓线的状态,是否有边伸出这个线(称之为插头), 还要记录伸出来的边的连通性. 记录连通性的方法: 最小表示法 括号表示法(适用范围较小,效率一般更高):出边是两两配对的(如果没有回来就有终点了):并且出边不可能交叉(因为如果有交叉就经过重复点了).咱们用三进…
基于连通性的状压dp 巧妙之处:插头已经可以表示内部所有状态了. 就是讨论麻烦一些. 简介 转移方法:逐格转移,分类讨论 记录状态方法:最小表示法(每次要重新编号,对于一类没用“回路路径”之类的题,可以胜任) 括号表示法(便于操作,但是一些题不能记录状态) 状态存储方法: 不能直接循环所有可能状态,因为状态不满太浪费 哈希+滚动数组 (clear时候,直接memset(hd),cnt=0就是最快的!!!!) 然后具体题目分清楚转移情况讨论即可. 例题 尝试加入各种剪枝以减少状态量. 经典入门例题…
插头DP(我也不知道该怎么定义...)是一种类似于洛谷题目([模板]插头DP)的题目 题目特征为: 在棋盘上 某一维的数据范围很小 完全铺满 计数问题 直接看题吧. [模板]插头DP 给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法?(2<=n,m<=12) 考虑依次枚举每一个格子,存储轮廓线的状态. 例如图中我们当前正在考虑转移橙色格子,那么轮廓线就是图中的红线. 我们存储轮廓线上的插头.什么是插头呢? 例如下图 本图中的连线在轮廓线上的相交处就是所谓的插…
直接看CDQ在2008年的论文吧. 个人认为她的论文有两个不明确的地方, 这里补充一下: 首先是轮廓的概念. 我们在进行插头DP时, 是从上往下, 从左往右逐个格子进行的, 已经处理的格子与未经处理的格子之间的分界线叫做轮廓线. 因此每个时刻轮廓线的长度都为列数加一. 每次处理下一个格子时, 有且仅有两条轮廓线会变动. 至于什么是插头, 这个很好理解, 就是从格子里面连出来的线就叫做插头. 不难看出, 在本题中, 一个不可选的格子没有插头; 一个可选的格子有且仅有两个插头. 穿过轮廓线的插头叫做…
一种nb算法,可以求出数列的递推式. 具体过程是这样的. 我们先假设它有一个递推式,然后按位去算他的值. ;j<now.size();++j)(delta[i]+=1ll*now[j]*f[i-j-]%mod)%=mod; 这是我们算出了f[i]应当是多少,但是f[i]有可能不是我们算出的值,所以我们记录一个delta,为我们算出的值减去f[i]的结果. 然后查看一下之前有没有出过锅. 如果出过,那么就补一个0,然后塞过去.. if(!cnt){now.resize(i);cnt++;conti…
这里仅作为自我检查用,模板代码请移步其他博文 标+的表示已学完,标?的表示需要进一步学习,标-的表示有计划但未开始学习,标*的表示暂时没有计划学习 数学 ?BSGS +FFT&NTT ?Lucas&扩展Lucas ?差分约束 ?多项式处理 ?常系数齐次线性递推 ?拉格朗日插值 ?高斯消元 ?线性基 +矩阵快速幂 -卡特兰数 +扩展欧几里得 ?生成函数相关 ?矩阵.行列式 +莫比乌斯反演 ?容斥 ?斯特林数 -线性规划 ?中国剩余定理 +裴蜀定理 *二次剩余 ?博弈论&sg相关 -群…
插头dp 感受: 我觉得重点是理解,算法并不是直接想出怎样由一种方案变成另一种方案.而是方案本来就在那里,我们只是枚举状态统计了答案. 看看cdq的讲义什么的,一开始可能觉得状态很多,但其实灰常简单 就像lyd说的,考插头dp的题目就是在考模板2333 (学这个之前连hash_map都没写过2333 WA: (1) 初始化矩阵,周围格子有可能是0--->转移出错 (2)统计答案最后统计的是合法的,即st==0的... 题目集锦: (1)cojs1512 经过所有可经过的点的一条回路个数 因为是一…
比赛的时候没看题,赛后看题觉得比赛看到应该可以敲的,敲了之后发现还真就会卡题.. 因为写完之后,无限TLE... 直到后来用位运算代替了我插头dp常用的decode.encode.shift三个函数以及改改HASH值才勉强过的...7703ms 题意:给一个N*M的01矩阵,每次可以选一个格子进行2种操作,①翻转邻居格子②翻转邻居格子和自己.输出最小的总操作数使得矩阵全为0. 显然每个格子有4种操作(一.不操作:二.①②:三.①:四.②). 一开始写的时候用2位表示一个插头,一位用于表示翻转当前…
插头DP基础题的样子...输入N,M<=11,以及N*M的01矩阵,0(1)表示有(无)障碍物.输出哈密顿回路(可以多回路)方案数... 看了个ppt,画了下图...感觉还是挺有效的... 参考http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710343.html 以及推荐cd琦的论文ppthttp://wenku.baidu.com/view/4fe4ac659b6648d7c1c74633.html 向中学生学习~~ 感觉以后可能还会要…
题目链接 USACO 第6章,第一题是一个插头DP,无奈啊.从头看起,看了好久的陈丹琦的论文,表示木看懂... 大体知道思路之后,还是无法实现代码.. 此题是插头DP最最简单的一个,在一个n*m的棋盘上,有些点能走,有些点不能走,可以走一条回路,也可以多回路,把所有点走完,有多少种走法.. 这题的背景还是dota,还是屠夫,还是吃树...我还是不会玩屠夫啊... 学习此题,看的下面的大神的博客,图画很棒,位运算又学了一个新用法. http://blog.csdn.net/xymscau/arti…
这道题很神啊…… 神爆了…… 思路大家应该看别的博客已经知道了,但大部分用的插头DP.我加了预处理,没用插头DP,一行一行来,速度还挺快. #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <cmath> #define N 100100 #define M 50 #defi…
基于联通性的状态压缩动态规划是一类非常典型的状态压缩动态规划问题,由于其压缩的本质并不像是普通的状态压缩动态规划那样用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的<基于连通性状态压缩的动态规划问题>,然后写了一裸题. 其实也很好写嘛,不过在转移的时候要万分小心,…
PJ可能会用到的动态规划选讲-学习笔记 by Pleiades_Antares 难度和速度全部都是按照普及组来定的咯 数位状压啥就先不讲了 这里主要提到的都是比较简单的DP 一道思维数学巧题(补昨天) 先看一道外文题目: (简单翻译稍微改了下,原题目戳我) 现在PA要放技能,要放n(10e9)个技能, 但是放技能有冷却时间,x秒才能放一次. PA有两个事情可以做: 有m个天赋可以学习,第i个天赋要花b[i]块钱,作用是把冷却时间改为a[i]. 可以找个打手,有k个打手可以找,请第i个打手需要花掉…
简介 插头DP(轮廓线DP)是用来解决网格图回路问题的一种算法. 插头DP解决的经典问题就是统计经过所有格子的哈密顿回路条数,某些格子有障碍. ​ 如果问题稍微进阶一点的话,不一定要求路径是回路.路径带权等等情况都可能出现. ​ 它的时间复杂度比较高,但是已经属于比较高效的算法了. 基本概念 ​ 首先看经典问题:统计一个带障碍的\(n*m\)网格中\((n,m\le 12)\),经过所有格子的哈密顿回路的条数. 插头DP的状态围绕轮廓线进行转移. 我们的状态是\(f(i,j,state)\),表…
Betsy's TourDon Piele A square township has been divided up into N2 square plots (1 <= N <= 7). The Farm is located in the upper left plot and the Market is located in the lower left plot. Betsy takes her tour of the township going from Farm to Mark…