hdu1693 Eat the Trees 【插头dp】】的更多相关文章

题目链接:https://vjudge.net/problem/HDU-1693 Eat the Trees Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4505    Accepted Submission(s): 2290 Problem Description Most of us know that in the game c…
原文链接http://www.cnblogs.com/zhouzhendong/p/8433484.html 题目传送门 - HDU1693 题意概括 多回路经过所有格子的方案数. 做法 最基础的插头dp裸题. 只要一个横向插头和一排纵向插头就可以了. 分类也很少. 插头dp -> http://www.cnblogs.com/zinthos/p/3897854.html 代码 #include <cstring> #include <cstdio> #include <…
想当初,我听见大佬们谈起插头DP时,觉得插头DP是个神仙的东西. 某大佬:"考场见到插头DP,直接弃疗." 现在,我终于懂了他们为什么这么说了. 因为-- 插头DP很毒瘤! 为什么? 等等你就知道这是为什么了. 例题 hdu 1693 Eat the Trees 题目大意:给你一个地图,每个格子是空地或者障碍.现在要用若干个回路来覆盖这些空地,使得每个空地皆被一个回路覆盖.问方案数. n,m<=11 How to solve it? 暴力?本人的暴力水平太弱了,对于这题,似乎连暴…
题目链接 USACO 第6章,第一题是一个插头DP,无奈啊.从头看起,看了好久的陈丹琦的论文,表示木看懂... 大体知道思路之后,还是无法实现代码.. 此题是插头DP最最简单的一个,在一个n*m的棋盘上,有些点能走,有些点不能走,可以走一条回路,也可以多回路,把所有点走完,有多少种走法.. 这题的背景还是dota,还是屠夫,还是吃树...我还是不会玩屠夫啊... 学习此题,看的下面的大神的博客,图画很棒,位运算又学了一个新用法. http://blog.csdn.net/xymscau/arti…
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1693 第一道插头 DP ! 直接用二进制数表示状态即可. #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; ,M=(<<)+; int n,m,bin[N];ll dp[N][N][M]; int b[N][N]; void…
[题目分析] 吃树. 直接插头DP,算是一道真正的入门题目. 0/1表示有没有插头 [代码] #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define u64 unsigned long long #define F(i,j,k) for (int i=j;i<=k;++i) int n,m,t,a…
题目链接 hdu1693 题解 插头\(dp\) 特点:范围小,网格图,连通性 轮廓线:已决策点和未决策点的分界线 插头:存在于网格之间,表示着网格建的信息,此题中表示两个网格间是否连边 状态表示:当前点\((i,j)\)和轮廓线上\(m + 1\)个插头的状态 状态转移: 我们用\(f[i][j][s]\)表示如上的状态,最后一次决策点为\((i,j)\),轮廓线上插头状态为\(s\)的方案数 比如上图\(s = 1101001\) 之后我们扩展新的点,枚举它插头的状态进行转移 在本题中,要使…
题目大意: 题目背景竟然是dota!屠夫打到大后期就没用了,,只能去吃树! 给一个n*m的地图,有些格子是不可到达的,要把所有可到达的格子的树都吃完,并且要走回路,求方案数 题解: 这题大概是最简单的插头dp了.. 比陈丹琦论文里的例题还要简单,因为允许有多个回路,所以不需要存储插头之间的连通性,直接二进制状压 搞清楚插头和轮廓线的概念基本就可以做出来了 这里有一些资料http://www.docin.com/p-741918386.html 代码: #include <iostream> #…
Description 题意:在n*m(1<=N, M<=11 )的矩阵中,有些格子有树,没有树的格子不能到达,找一条或多条回路,吃完所有的树,求有多少种方法. Solution 插头DP入门题,\(dp[i][j][k]\)表示\(G_{i,j}\)且轮廓线状态为\(k\)时的方案数 转移有6种, Code #include <cstdio> #include <cstring> #include <algorithm> #define N 14 #def…
传送门 题意简述:给一个有障碍的网格图,问用若干个不相交的回路覆盖所有非障碍格子的方案数. 思路:轮廓线dpdpdp的模板题. 同样是讨论插头的情况,只不过没有前一道题复杂,不懂的看代码吧. 代码: #include<bits/stdc++.h> #include<tr1/unordered_map> #define ri register int using namespace std; using namespace tr1; typedef long long ll; int…
传送门: https://zerojudge.tw/ShowProblem?problemid=a228 http://acm.hdu.edu.cn/showproblem.php?pid=1693 [题解] 插头dp第一题(难以置信我高中oi没有写过23333) 方程很简单,自己推一推插头的地方的连通性即可 放几张图跑了 # include <stdio.h> # include <string.h> # include <iostream> # include &l…
Description: 给出n*m的方格,有些格子不能铺线,其它格子必须铺,可以形成多个闭合回路.问有多少种铺法? Hint: \(n,m<=12\) Solution: 与原来单回路那题转移方程有些不同,详见代码 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int mxn=15,c[4]={0,-1,1,0}; struct data { int key; ll val; }; ll…
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样,并且有不少的分类讨论,让插头DP十分锻炼思维的全面性和严谨性. 下面我们一起来学习插头DP的内容吧! 插头DP主要用来处理一系列基于连通性状态压缩的动态规划问题,处理的具体问题有很多种,并且一般数据规模较小. 由于棋盘有很特殊的结构,使得它可以与“连通性”有很强的联系,因此插头DP最常见的应用要数…
插头dp 感受: 我觉得重点是理解,算法并不是直接想出怎样由一种方案变成另一种方案.而是方案本来就在那里,我们只是枚举状态统计了答案. 看看cdq的讲义什么的,一开始可能觉得状态很多,但其实灰常简单 就像lyd说的,考插头dp的题目就是在考模板2333 (学这个之前连hash_map都没写过2333 WA: (1) 初始化矩阵,周围格子有可能是0--->转移出错 (2)统计答案最后统计的是合法的,即st==0的... 题目集锦: (1)cojs1512 经过所有可经过的点的一条回路个数 因为是一…
插头dp?你说的是这个吗? 好吧显然不是...... 所谓插头dp,实际上是“基于连通性的状态压缩dp”的简称,最先出现在cdq的论文里面 本篇博客致力于通过几道小小的例题(大部分都比较浅显)来介绍一下这种思路清奇的dp是怎么回事 Part I 定义 何为插头? 插头实际上是一个代称,代指两个格之间的连通性 若dp的某一个状态中,有某相邻的两个格子是联通的(比如说处在同一条路径上.被同一个矩形覆盖blablabla),我们就认为这两个格子之间有插头 举个栗子,格子(1,1)和格子(2,1)联通,…
题目链接: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…
hdu1693 Eat the Trees 题意 在\(n*m\)的矩阵中,有些格子有树,没有树的格子不能到达,找一条或多条回路,吃完所有的树,求有多少种方法. 解法 这是一道插头dp的入门题,只需要考虑插头的有无,不需要维护连通性,很愉快. 代码 #include <cstring> #include <cstdio> #include <cstdlib> #define del(a,b) memset(a,sizeof(a),b) using namespace s…
插头DP 插头dp模板题…… 这题比CDQ论文上的例题还要简单……因为不用区分左右插头(这题可以多回路,并不是一条哈密尔顿路) 硬枚举当前位置的状态就好了>_< 题解:http://blog.csdn.net/xymscau/article/details/6756351 //HDU 1693 #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #incl…
[HDU1693]Eat the Trees(插头dp) 题面 HDU Vjudge 大概就是网格图上有些点不能走,现在要找到若干条不相交的哈密顿回路使得所有格子都恰好被走过一遍. 题解 这题的弱化版本吧... 因为可以任意分配哈密顿回路的数量,因此根本不需要再考虑插头的配对问题了,那么直接分情况转移就好啦. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #in…
插头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 向中学生学习~~ 感觉以后可能还会要…
题目大意:要求你将全部非障碍格子都走一遍,形成回路(能够多回路),问有多少种方法 解题思路: 參考基于连通性状态压缩的动态规划问题 - 陈丹琦 下面为代码 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define N 12 #define S (1 << 12) int n, m; long long dp[N][N][S]; int cas = 1…
Eat the Trees Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5079    Accepted Submission(s): 2628 Problem Description Most of us know that in the game called DotA(Defense of the Ancient), Pudge…
Problem Description Most of us know that in the game called DotA(Defense of the Ancient), Pudge is a strong hero in the first period of the game. When the game goes to end however, Pudge is not a strong hero any more.So Pudge’s teammates give him a n…
题意:给一个n*m的矩阵,为1时代表空格子,为0时代表障碍格子,问如果不经过障碍格子,可以画一至多个圆的话,有多少种方案?(n<12,m<12) 思路: 这题不需要用到最小表示法以及括号表示法. 以一个非障碍格子为单位进行DP转移,所以可以用滚动数组.只需要保存m+1个插头的状态,其中有一个是右插头,其他都是下插头,若有插头的存在,该位为1,否则为0,初始时都是0. 需要考虑的是,(1)如果两个边缘都是插头,那么必须接上它们:(2)如果仅有一边是插头,则延续插头,可以有两个延续的方向(下和右)…
题目链接 题意: 给出一个n*m大小的01矩阵,在其中画线连成封闭图形,其中对每一个值为1的方格,线要恰好穿入穿出共两次,对每一个值为0的方格,所画线不能经过. 参考资料: <基于连通性状态压缩的动态规划问题> ——陈丹琦 2008年国家集训队论文 递推过程中,按照 遍历行->遍历行上每一格->遍历 “轮廓线跨过该格时所有可能的状态变化”   的顺序 这样复杂度是 O(n*m*2m+1)  (m+1是因为轮廓线上有m个单元是与列数对应的,另有一单独的竖线单元) 问题关键点在于解决 …
题意:在n*m的矩阵中,有些格子有树,没有树的格子不能到达,找一条或多条回路,吃全然部的树,求有多少中方法. 这题是插头dp,刚刚学习,不是非常熟悉,研究了好几天才明确插头dp的方法,他们老是讲一些什么轮廓线啊,插头啊什么的,刚開始全然不知道这些事干什么的,看完cdq的大作后也是一头的雾水,看代码,绘图,一步一步的推,最终明确了,那个是为什么,这里讲一讲. 轮廓线表示的是当前插头的状态,这题中状态中1表示有插头,0表示无插头,假设是横线的话就是上面的格子与以下的格子相连的状态,这题中显然一个格子…
题意:给了一个矩阵图,要求使用回路把图中的树全部吃掉的方案树,没有树的点不能走,吃完了这个点也就没有了,走到哪吃到哪 用插头dp搞 #include <iostream> #include <algorithm> #include <cstdio> #include <vector> #include <string.h> using namespace std; typedef long long LL; ][]; int nrows,ncol…
传送门 先坑着,等啥时候会了再来填坑 不得不说思路真的是很妙啊 //minamoto #include<iostream> #include<cstdio> #include<cstring> #define ll long long using namespace std; #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) <…
正题 题目链接:https://www.luogu.com.cn/problem/P5074 题目大意 给出一个\(n\times m\)的网格,有的必须铺线有的不能,铺成若干条闭合回路,求方案数. \(1\leq n,m\leq 12\) 解题思路 考虑插头\(dp\),因为可以随意开回路,所以就没有严格匹配的限制了,可以直接用二进制记录每个位置有没有插头就好了. 时间复杂度:\(O(nm2^m)\) code #include<cstdio> #include<cstring>…
这种动归有很多名字,插头DP是最常见的 还有基于连通性的动态规划 轮廓线动态规划等等 超小数据范围,网格图,连通性 可能算是状态压缩DP的一种变式 以前我了解的状压DP用于NP难题的小数据范围求解 这里说一下哈密顿回路的概念: 哈密顿回路: .指一个对图的每个顶点都只穿越一次的回路.也可以 定义为n+1个相邻顶点v0, v1, … ,vn, v0的一个序列,其中序列的第一个顶点和最后一个顶点是相同的,而其他n-1个顶点是互不相同的. .当这个图是加权图时,求该图的最短哈密顿回路,就是传说中的旅行…