- 博客(36)
- 收藏
- 关注
原创 hdu4771 Stealing Harry Potter's Precious A*算法寻路
题目大意: 给定一个n*m的方格图,有障碍和K个目标(K<=4),求从某点出发经过所有目标的最短路线解法:根据只有4个目标,可以先算出每个目标之间的距离,而后从出发点开始进行深搜即可。 对题目中带障碍的静态方格图,A*算法可以非常高效的求出两点之间最短距离。对于估值函数,可以计算较为高效的曼哈顿距离(x坐标之差绝对值加上y坐标之差绝对值之和),可以证明这样的估值函数得到的最终结果必定最优。#p
2015-10-15 16:30:08
502
原创 UVALive 3882 And Then There Was One 约瑟夫环问题
约瑟夫环问题是一类经典问题,具体的问题描述如下 已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。抄自百度百科2333模拟法不谈,数学上对于这类问题有一般的递推公式如下 F(i)=(F(i−1)+m)modi(1<i<=n)F(i)=(F(i-
2015-10-14 19:44:28
416
原创 UVA10635 Prince and Princess 动态规划
刷刷水题找手感题目大意:有一个n*n的矩阵,从左到右从上到下把格子编号为1,2,……n*n,有两个人从要从左上角格子1采取不同的行动路线到达右下角格子n*n。移动路线除了不能重复外没有限制,因此最终路线是1,2,3……p的一个排列(p是走了几步) 现在给出这两个人的行动序列,求出通过去除路径上的点,两人能一起行走的最长路线。乍一看是LCS,但是空间超,就算优化了空间也会超时间。 注意到题目中的序
2015-10-14 17:21:51
462
原创 hdu3673 David Shopping 堆
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3673 题目大意:给定口袋大小m,及一个大小为n的礼品序列,当新礼品加入时,如果相同礼品在口袋中,则该礼品的“平凡程度”+1,如果无相同礼品且有多余空间,则放入,如果无多余空间,则把平凡程度最大的礼物舍弃。若有相同,优先舍弃最早放入口袋中的礼品。求丢了多少次礼品解析:分析题目可以看出优先队列的影子,但是
2015-10-13 16:42:35
767
原创 hdu3672 Caves 树形dp
题目大意:给定一个带权树与若干询问,找出一个以根为起点的遍历路径,使其路径权和小于询问值并且遍历点数尽量多。显然是树形dp。因为询问的值最大有5*10^6,点也有500个,因此dp状态不能定义为当前消耗最多的路径点数,而应反过来,定义为当前点数最小的消耗。对每个点定义状态dp[i][j],i表示遍历了i个点(包括自己),j=0表示遍历结束回到该点,j=1表示不回到该点,则有状态转移方程如下(dpp表
2015-10-12 21:34:40
574
原创 hdu3671 Boonie and Clyde (Tarjan求割点)
http://acm.hdu.edu.cn/showproblem.php?pid=3671题目大意:给定连通无向图,求可行的点对的数量,该点对可以使图在删去该点对后剩下的图中,至少有一对点不连通。Tarjan算法求强连通图的复杂度是O(n),如果直接枚举两个点并且求连通的话,总的复杂度为O(n^3)如果先删去一个点,如果剩下的图分成了二个以上的块,则认为只要删去了这个点,剩下n-1个点无论删去哪个
2015-10-12 16:37:19
1023
原创 hdu5211 Mutiple
中文题目 wld有一个序列a[1..n]a[1..n], 对于每个1≤i<n1≤i<n, 他希望你求出一个最小的j(以后用记号F(i)表示),满足i<j≤ni<j≤n, 使ajaj为aiai的倍数(即aj mod ai=0),若不存在这样的j,那么此时令F(i)=0F(i) = 0 保证1≤n≤10000,1≤ai≤100001≤n≤10000,1≤ai≤10000 对于任意1≤i≤n1≤i≤n
2015-06-02 17:59:17
508
原创 hdu5234 Happy birthday 动态规划
dp[i][j][k]为在点(i,j),当前获得量为k的方法是否存在要求解点(i,j),有(i-1,j)和(i,j-1)的答案即可得出(因为题目中只允许向下向右走数据并不强,也并不需要压缩空间#include<iostream>#include<iomanip>#include<cstdio>#include<cstring>#include<sstream>#include<stack>
2015-06-01 17:31:41
337
原创 hdu1677 Nested Dolls Dilworth定理
定理1 令(X,≤)是一个有限偏序集,并令r是其最大链的大小。则X可以被划分成r个但不能再少的反链。 其对偶定理称为Dilworth定理: 定理2 令(X,≤)是一个有限偏序集,并令m是反链的最大的大小。则X可以被划分成m个但不能再少的链。链:集合中任意两个元素可比 反链:任意两个元素不可比这题中,要求的是链的最小划分(当一个可以套住另一个时即为可比) 只需求出最大反链。 因为当一个节点的
2015-05-21 13:16:39
905
原创 hdu1198 Farm Irrigation DFS
http://acm.hdu.edu.cn/showproblem.php?pid=1198 核心思想是dfs,非常简单,一个地和另一个地在邻边上都有水道即连通,用标记求出连通子图数量即可。但是题目故意出出来恶心死人对于这样的题目,a了没意思,你还得写的最短,才算是过,对不对。我们把题目中的几个样式图都存到数组里去,存的方式是一个图对应4个bool变量,分别是上下左右是否有管道记得把0位置留给没有
2015-05-19 20:47:16
376
原创 hdu1513 Palindrome 动态规划
求让一个字符串变为回文串所需最少插入字符数定义状态dp[i][j]dp[i][j] 表示从左到右i个字符,从右到左j个字符,要让他们回文需要插入多少字符显然,a[i]==a[j]a[i]==a[j]时,dp[i][j]=dp[i−1][j−1]dp[i][j]=dp[i-1][j-1] a[i]!=a[j]a[i] !=a[j]时,就需要插入一个字符,因此dp[i][j]=min(dp[i−1]
2015-05-16 14:50:26
307
原创 hdu1502 Regular Words 动态规划 高精度 打表
一题顶三题,上楼不费劲定义状态dp[i][j][k],ijk分别代表abc的字母的个数那么dp[i][j][k]合法当且仅当i>=j>=k,同时我们只需要输出dp[n][n][n]作为结果 不合法的位置置为0即可dp[i][j][k]=dp[i−1][j][k]+dp[i][j−1][k]+dp[i][j][k−1]dp[i][j][k] = dp[i-1][j][k]+dp[i][j-1][k
2015-05-16 10:12:27
544
原创 hdu1501 Zipper 动态规划
很有意思的一道题,感觉应该有很多种解法。本菜这里用的是动态规划给出三个字符串,最后一个字符串是前两个字符串所有字母的打乱组合问第三个字符串能否由前两个字符串,不打乱字符顺序,“镶嵌”得到。还是那句话,大胆定义状态(子问题)由字符串a的前i个字母,和字符串b的前j个字母,能否有合法解?储存在布尔数组dp[i][j]中,true表示合法,false表示不合法直接推出由源状态转移至目标状态的方程往往是不容
2015-05-15 23:36:17
442
1
原创 hdu1494 跑跑卡丁车 动态规划
首先将能量和加速卡这个设定混合一下,把有一张加速卡看做有100%能量 那么,从0能量0加速卡到80能量2加速卡,可以对应为能量0,1,2,3……14 (20能量作1单位) 消耗加速卡即为能量减100接下来,大胆的将状态定为 能量槽、道路段 的组合。 dp[n][m] ,n为当前路段,m为当前能量 那么很容易得出状态转移方程(省略了条件,条件见代码)dp[i][j]=min⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪
2015-05-15 22:54:49
525
原创 hdu1573 X问题 中国剩余定理
没啥好说的……#include<iostream>#include<iomanip>#include<cstdio>#include<cstring>#include<sstream>#include<stack>#include<queue>#include<fstream>#include<algorithm>#include<map>#include<set>#inclu
2015-05-15 22:38:13
328
原创 hdu1272 小希的迷宫 并查集
并查集不多说,这道题主要注意 1.坑爹的输入输出,0 0要输出一个Yes 2.判断是森林还是树。我的判断方法是看点和边的数量关系。节点数-1 == 边数 是为森林的必要条件#include<iostream>#include<iomanip>#include<cstdio>#include<cstring>#include<sstream>#include<stack>#incl
2015-05-07 22:26:37
264
原创 hdu1829 A Bug's Life 并查集
题目内容非常不社会主义核心价值观,提取成数学意义即 给定若干点及其边,判断是否是二分图哦哟原来图题还可以跳过矩阵、邻接表,强强强维护一个数组oppsite[](opp)读到一个边(a,b),如果opp(a)未初始化,则opp(a)=b,opp(b)同理如果opp(a)初始化了,意味着之前有读到a的边,那么b和之前读到的那个边的另一个点是同集的,合并。 opp(b)同理按需合并操作完毕之后,检查a
2015-05-07 20:00:36
372
原创 hdu1856 More is better 并查集
马上要比赛了……构建并查集,输出最大的集合的元素个数即可普通并查集并没有保存元素个数只需要在合并的时候将元素个数保存在根节点即可。这里开了一个w数组另外题目给的是102400 K,并不害怕爆内存233#include<iostream>#include<iomanip>#include<cstdio>#include<cstring>#include<sstream>#include<st
2015-05-07 18:53:16
292
原创 hdu1282 回文数猜想 字符串操作
掌握逆序迭代器的使用以及stringstream的使用,这道题还是挺轻松的#include<iostream>#include<cstdio>#include<cstring>#include<sstream>#include<queue>#include<fstream>#include<algorithm>#include<map>#include<vector>#includ
2015-05-02 10:58:41
313
原创 hdu1290 献给杭电五十周年校庆的礼物
http://acm.hdu.edu.cn/showproblem.php?pid=1290神奇的方法类似的分割的题目,不管是曲线也好折线也好在二维空间中,都可以用二次式表达式表达在三维空间中,都可以用三次表达式表达自己硬算出前几个,然后用待定系数法求出一个表达式即可#include<iostream>#include<cstdio>#include<cstring>#include<fst
2015-04-29 22:59:33
436
原创 hdu2157 How many ways?? 矩阵快速幂
while (cin>>n>>m,n!=0||m!=0) 而不是 while (cin>>n>>m,n!=0&&m!=0) 这个卡了半天我靠……一样的模板依然是构造变换矩阵左乘向量变换矩阵是图矩阵的转置。为啥,因为我凑出来是这样的……向量保存的是到某个点的方法总数乘k个变换矩阵,目标点对应的在向量中的数即为结果。#include<iostream>#include<cstdio>#inc
2015-04-29 12:09:32
318
原创 hdu5210 Delete
没啥好说的……#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<vector>#include<cmath>using namespace std;#define ll long longint A[111];int main(){ ci
2015-04-28 22:24:45
288
原创 hdu1588 Gauss Fibonacci 矩阵快速幂
F(x)F(x)是斐波拉契数列 给定一次函数g(x)=ax+bg(x)=ax+b 求 Σni=0F(g(i)) \underset {i=0} {\overset n {\Large \Sigma}} F(g(i)) 哦哟这个公式看起来逼格就是高根据矩阵乘法的思想,我们可以把F(n)=F(n−1)+F(n−2)F(n)=F(n-1)+F(n-2) 作成变换矩阵 RR ,连乘a次后
2015-04-28 14:37:54
404
原创 hdu1575 Tr A 矩阵快速幂
矩阵快速幂详见上一篇这题貌似更裸一点……#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<vector>#include<cmath>using namespace std;#define ll long long//Template mat//I
2015-04-26 13:20:36
311
原创 hdu1757 - A Simple Math Problem 矩阵快速幂
今天学矩阵突然开窍了总结一下就是,矩阵乘法是没有实际意义的 (这里的意思是,在现实中找不到对应的东西,这是一个纯数学方法) 而且把原本普通算数可以做的事情转变成矩阵乘法是多此一举 比如说把点(x,y)左右平移10个单位,非常简单地可以想到变换后的坐标是(x+10,y)或者(x-10,y)。那为什么要用一个矩阵去表示这种变换呢?因为矩阵乘法有结合律! 说点实际例子。假设不使用矩阵乘法,那么平
2015-04-26 12:02:41
602
原创 C#学习小记(1) - 集合接口ICollection,IEnumerable,IEnumerator等的关系
这是博主看书的暂时的小记,未来有时间会整理成学习资料,目前仅供看着乐今天看书看到泛型,泛型中用集合接口做了例子,就想顺便理一下集合的各种接口的意思咱先假定已经知道什么是接口了,啊 注:以下大部分内容,只要在后面加一个< T > ,就可以泛型啦 C#中实现集合有很多办法,比如说数组,比如说ArrayList,比如说List话说相比之下ArrayList和List比起来似乎一无是处,回头做个比较。那
2015-04-08 23:10:45
513
原创 hdu1243 反恐训练营(动态规划 LCS)
http://acm.hdu.edu.cn/showproblem.php?pid=1243全是变着法子lcs用map储存一个字母对应的分值即可因为不知道数据范围,二维数组开大会炸,于是用模2数组,感觉自己屌屌哒#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#includ
2015-04-06 15:14:52
673
原创 hdu5199 Gunner(STL map的使用)
上次bc智商不够第一题卡一个钟,这次简单了结果忘记参加……题意是有大量的鸟站在不同高度的树上向一个高度开一枪那么这个高度的鸟全没啦~有10^9个高度,手动离散化又臭又长容易错,直接上map。射下来之后置个0就行,简单粗暴注意map里find()的用法,未找到元素时返回的是end()迭代器。注2:map是有序的关联容器,如果可以使用无序的关联容器的话可以更快。(比如unordered_map,本人比较
2015-04-06 11:21:14
447
原创 hdu1158 Employment Planning(动态规划)
还是简单的动态规划 dp[i][j]表示i月有j个员工在职,可以根据i-1月转移而来。#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int needed[13];int n;int hire,sal,fire;int dp[13][1111]; //dp[i][j]表示第i个月有j
2015-04-06 11:14:30
416
原创 hdu1159 Common Subsequence(LCS)
http://acm.hdu.edu.cn/showproblem.php?pid=1159裸的最长公共子序列a[i]=b[j]时dp[i][j]=dp[i-1][j-1]+1 否则dp[i][j]=max(dp[i-1][j],dp[i][j-1]) dp[i][j]表示a串前i个字符和b串前j个字符的lcs另外子序列(Subsequence)和子串(Substring)是不一样的前者可以不连
2015-04-06 11:12:34
261
原创 hdu1224 Free DIY Tour(动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=1224看起来很复杂其实是非常简单的dp……题意说明了只有低往高走的情况因此可以从从小到大遍历各点,更新每条边终点的点的最大interest#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#
2015-04-06 11:08:44
822
原创 hdu1081 To The Max(动态规划-最大子矩阵)
20分钟就a了,突然感觉自己好强啊,嗯♂?先是最基本的思路,枚举所有子矩阵,必定超时计算所有子矩阵中的计算有大量重复,尝试定义状态dp[i][j],表示以i行j列元素为矩阵右下角的子矩阵所得到的最大子矩阵和然而这样并不能转移加一个限制,状态dp[i][j][k],i和j同上,k表示这个子矩阵高度为k,那么同一行的dp[i][j][k]就可以由dp[i][j-1][k]转移过来突然发现,这种状态定义,
2015-04-03 13:02:06
392
原创 hdu1080 Human Gene Functions (动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=1080 难得徒手撸一题dp……并不能是lcs,只能是有点像刚看到有点迷茫,比较自然地确定一个状态dp[i][j],表示处理到串a的i位,串b的j位然而存在着一个’-‘的设定……先假定为dp[i][j]指的结果的是对齐了的,有一方的结尾是’-‘或者都不是’-‘对于一个状态i,j来说,可以从i-1,j-1或者i,j-
2015-04-02 13:47:09
314
原创 hdu1059 Dividing (多重背包)
题意:将价值分别为1,2,3,4,5,6的6种多个物品平均分两坨所有物品数量加起来不超过2w个很容易想到dp的思路,dp[i]表示是否存在使价值为i的选法,dp[i]=dp[i-j] j为物品的价值。然后对所有物品进行这种循环即可,但是会超时,这时候就需要将大量的相同物品二进制分割,具体的原理需要用心去感受,这是背包九讲中的原文: 方法是:将第i种物品分成若干件物品,其中每件物品有一个系数,这件
2015-04-01 21:24:38
270
原创 hdu1024 Max Sum Plus Plus(动态规划)
做过很多次都没a的题,今天仔细看了一些大牛的博客给强a了。边界处理要注意……#include <iostream>#include <cstring>#include <cmath>#include <algorithm>#include <queue>#include <stack>#include <map>#include <fstream>#define NINF INT_M
2015-04-01 19:08:14
369
原创 hdu1011 Starship Troopers(树形dp)
开始尝试写写博客树形dp,111数组大小过不了runtime error好久以为是自己代码错了,赞对一个点n,最多派出m个士兵,得到的最大可能保存在dp[n][m] 计算方法是遍历所有子节点进行背包。第一次做这种稍微复杂的题目做了一天,太鸡了得多练顺便学到了无权图可以用vector保存邻接链表,挺好挺简洁。有权图应该也可以用pair#include <iostream>#include <cst
2015-03-31 23:25:08
241
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人