1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 942  Solved: 356[Submit][Status][Discuss] Description Regardless of the fact, that Vologda could not get rights to hold the Winter Olympic games of 20**, it is well-known, that t…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1814 普通的插头 DP .但是调了很久.注意如果合并两个 1 的话,不是 “把向右第一个 2 该成 1 ”,而是 “把向右第一个没有与 1 匹配的 2 改成 1 ”. 原来获取哈希值是用字符串哈希的方法,遍历12个位置:太慢.直接对某数取模作为哈希值,手写哈希表保证不会找错状态.大概 1e5 个状态? 在转移的时候看一下下方和右边有没有障碍.只做合法的转移的话,取答案的时候就不用在判断 “…
用的括号序列,听说比较快. 然并不会预处理,只会每回暴力找匹配的括号. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define N 199917 #define ll long long #define bp 1<<bit[j-1] #define bq 1<<bit[j] using namespace std; int n,…
1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 924  Solved: 351[Submit][Status][Discuss] Description  一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数 Input The first line contains the integer numbers N and M (2 ≤ N, M ≤ 12). Each of…
[BZOJ1814]Ural 1519 Formula 1 题意:一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数.(n,m<=12) 题解:插头DP板子题,刷板子,附带题解链接. 如何存放状态呢?可以采用hash,我们的hash表形如一个队列,每次新加入一个状态时,就沿着这个状态在队列中对应的hash值不断向后找,直到找到这个状态或者发现一个空位为止. 本题我的状态采用了4进制表示. #include <cstdio> #include <cstr…
这是一道经典的插头DP单回路模板题. 用最小表示法来记录连通性,由于二进制的速度,考虑使用8进制. 1.当同时存在左.上插头的时候,需要判断两插头所在连通块是否相同,若相同,只能在最后一个非障碍点相连:若不相同,则把这两个连通块连起来. 2.如果只存在左或上插头的时候,则要延续连通块. 3.若都不存在左和上插头的时候,就要新建一个连通块. #include <cstdio> #include <cstdlib> #include <cstring> #include &…
设f[i][j][s]为轮廓线推到格子(i,j),状态为s的方案数 括号表示一段线的左端和右端,表示成左括号和右括号,状压的时候用1和2表示,0表示已经闭合 下面的蓝线是黄色格子的轮廓线,dp转移要把它转到橙色轮廓线,设已经在状压的s中取到两条边的状态记为b1,b2 然后分很多情况讨论: (i,j)是障碍:那就只能什么都不放的转移,也就是只能从b1=0,b2=0转移到新轮廓线的b1=0,b2=0 if(!a[i][j]) { if(!b1&&!b2) add(x,v); } b1=0,b2…
Description 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 conduct one of the Formula 1 events. Surely, for such an important thing a new race circuit should be…
[题目]1519. Formula 1 [题意]给定n*m个方格图,有一些障碍格,求非障碍格的哈密顿回路数量.n,m<=12. [算法]插头DP [题解]<基于连通性状态压缩的动态规划问题> by CDQ(万恶之源T_T) 如果你想学最小表示法,当然首推kuangbinの博客. 基本思想是逐格推进,维护轮廓线的m+1个插头的状态,每个插头有一个编号,连通的插头编号相同. 由于只转移和记录有效状态,所以时空复杂度都大大优于普通的状压DP. 1.存储:容易发现连通编号至多0~6,所以用数字每…
[BZOJ1814]Ural 1519 Formula 1 (插头dp) 题面 BZOJ Vjudge 题解 戳这里 上面那个链接里面写的非常好啦. 然后说几个点吧. 首先是关于为什么只需要考虑三进制状态,因为哈密顿回路是不可能出现自交的,因此对于当前的轮廓线一定直接分割了哈密顿回路的一部分,不可能出现只考虑分割出来的情况下,存在插头的连通性直接交叉,否则一定不合法(比如说四个连续位置,你不可能\(1,3\)匹配,因为这样子画一条路径出来,无论如何都会和\(2,4\)的路径相交).因此,我们把一…
1519. Formula 1 @ Timus Online Judge 干了一天啊!!!插头DP入门. 代码如下: #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <ctime> #include <cmath> using namespace std; typedef long long LL; ; ; L…
Description 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 conduct one of the Formula 1 events. Surely, for such an important thing a new race circui…
插头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 向中学生学习~~ 感觉以后可能还会要…
今天早上学了插头DP的思想和最基础的应用,中午就开始敲了,岐哥说第一次写不要看别人代码,利用自己的理解一点点得写出来,这样才锻炼代码能力!于是下午慢慢地构思轮廓,一点点地敲出主体代码,其实是很磨蹭的,由于要考虑好多东西,而且昨晚2点睡的有点困,最后终于磨蹭出来了,第一次的代码搓没关系,自己写的才重要.然后果然不出我所料,调试到了晚上才A了(一个郁闷的错误)...A的感觉真的是爽呀,虽然搞了差不多一天.当然自己写了自己想的代码后也要把代码优化,不然队友看不懂自己代码就囧了... 插头DP,建议大家…
对插头DP的理解还不是很透彻. 先说一下肤浅的理解吧. 插头DP使用范围:指数级复杂度,且适用于解决网格图连通性问题,如哈密顿回路等问题.插头一般指每相邻2个网格的接口. 题目难度:一般不可做. 使用三进制状态,用0表示没有插头,1表示左括号插头,2表示右括号插头,而由于位运算常数特别小,可以采用四进制+手工hash的做法.处理好状态与编号的对应关系后进行dp,复杂度就只与合法状态数有关了,时间复杂度O(snm^2),其中s为合法状态数(不超过42000),而第二维的m显然也是不满的,因此可以通…
题意:给一个n*m的矩阵,格子中是'*'则是障碍格子,不允许进入,其他格子都是必走的格子,所走格子形成一条哈密顿回路,问有多少种走法? 思路: 本来是很基础的题,顿时不知道进入了哪个坑.这篇插头DP的文章够详细,推荐一看(最好不要照抄代码). 细节要小心,比如输出用I64d,必须用long long,判断是否无哈密顿回路,位操作等等. 这次仍然用括号表示法,1表示(,2表示). #include <bits/stdc++.h> #define pii pair<int,int> #…
1.什么是插头$DP$? 插头$DP$是$CDQ$大佬在$2008$年的论文中提出的,是基于状压$D$P的一种更高级的$DP$多用于处理联通问题(路径问题,简单回路问题,多回路问题,广义回路问题,生成树问题). 插头$DP$每道题都不一样,且需要进行较为繁琐的分类讨论,所以插头$DP$十分锻炼思维的严谨性和全面性. 2.插头$DP$思路 $\mathcal{A.}$状态确立 $\alpha.$插头 插头表示一种联通状态. 在棋盘模型中,一个格子有向某方向的插头,表示这个格子在这个方向与插头那边的…
[题目分析] 一直听说这是插头DP入门题目. 难到爆炸. 写了2h,各种大常数,ural垫底. [代码] #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 2000005 #define u64 unsigned long long #define F(i,j,k) for (int i…
题目链接: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…
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1519 题目分类:插头dp 题意:求经过所有可行点的哈密顿回路的个数  * 不可走 . 可以走  2 ≤ N, M ≤ 12 代码: 括号匹配法,转移有点复杂,但是时间空间比较小  #include<bits/stdc++.h> #define LL long long using namespace std; ; int n,m,now,pre; ]={,,,,,,,,,,,,};/…
题面: 传送门 思路: 插头dp基础教程 先理解一下题意:实际上就是要你求这个棋盘中的哈密顿回路个数,障碍不能走 看到这个数据范围,还有回路处理,就想到使用插头dp来做了 观察一下发现,这道题因为都是回路,所以联通块上方的插头一定两两配对,可以使用括号序列代替最小表示法 分情况讨论一下 情况一:当前格子上方和左方都没有插头 这种时候可以继续,也可以给当前格子加一个下插头一个右插头,相当于一个新的联通分量 情况二:上方有一个下插头,左边没有 这时有两个决策:可以向右转,也可以继续向下,操作就是分别…
http://acm.timus.ru/problem.aspx?space=1&num=1519 题目描述 一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数. 输入 The first line contains the integer numbers N and M (2 ≤ N, M ≤ 12). Each of the next N lines contains M characters, which are the corresponding cells…
括号表示法: 据说比下一个要快而且灵活. #include<iostream> #include<cstring> #include<cstdio> #define LL long long #define MAXN 20000 #define HASH 23333 #define ma(x,y) memset(x,y,sizeof(x)) using namespace std; struct Hash_map { int size,first[HASH],next[…
题意:给定一个 n * m 的矩阵,问你能花出多少条回路. #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <…
要判边界!!要判边界!!要判边界!!if(j!=m)!!! 我真是zz横着转移要判断到底能不能向右边出边-- 然后剩下的和1814差不多,九十因为不要求经过所有格子,所以左右括号随时可以合并,但是注意合并的时候轮廓线上不能有别的括号,然后还有是(0,0)可以转移到(0,0),相当一不经过这个格子 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=3…
题目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,…
我们今天来学习插头DP??? BZOJ 2595:[Wc2008]游览计划 Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点: 否则表示控制该方块至少需要的志愿者数目. 相邻的整数用 (若干个) 空格隔开, 行首行末也可能有多余的空格. Output 由 N + 1行组成.第一行为一个整数,表示你所给出的方案 中安排的志愿者总数目. 接下来 N行,每行M 个字符,描述方案中相应方块的情况: z '_'(下划…
建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议先理解“插头”的概念.然后会HASH表(这个其实是很基础的东西,应该都会的).然后就是DP. 以及特殊题目的特殊处理. 好像一般是求N,M<=12的网格图的某种回路数或某种通路数的方案数. 大体上每个题说几句特殊处理,有问题请纠正....题目的顺序基本上难度递增 另外代码我都是用括号匹配的.因为感觉连通…
T1 HDU1693:Eat the Trees 题目大意:给出n*m的方格,有些格子不能铺线,其它格子必须铺,可以形成多个闭合回路.问有多少种铺法? 插头Dp板子题,题目要求可以是多个回路, 只需要两个状态,代表是否有插头即可 $plug_1$ $plug_2$ 0     0     新建一个插头插向两边 0     1     转/不转弯 1     0     同上 1     1     合并插头 T2 Ural 1519 Formula 1 题目大意:一个 m * n 的棋盘,有的格…
集中做完了插头$dp$ 写一下题解. 一开始学的时候还是挺蒙的. 不过后来站在轮廓线$dp$的角度上来看就简单多了. 其实就是一种联通性$dp$,只不过情况比较多而已了. 本来转移方式有两种.逐行和逐格转移. 不过逐行转移因为分类太多所以被舍弃了. 一般的插头$dp$采用逐格转移. 插头表示已经进入当前格子的状态,而并不是将要进入的状态. 状态的表示方式常见的有两种:最小表示法和括号表示法. 括号表示法不如说是广义括号表示法的特殊一种情况,每个插头也就是左右括号就是表示两个相匹配的回路部分,而最…