
hdu
娜一笑最倾城
当代最有价值最具影响力最有活力的有志之狮,IT攻城狮
展开
-
hdu 3068 最长回文(manacher)
题意:给定一串字符串,求其中最长回文的长度,输出之。 题解:刚看到这题,以为用扩展kmp就可以解决,扩展kmp的时间复杂度是O(n*logn),对于此题,n最大为11W,但是测试用例有120组。一组测试用例大概就一两百万的处理量的样子,而一共有120组,那么总的处理就可能达到几个亿了,估计这样的复杂度是吃不消的。而且也看到别人说这题卡logn的时间(他是用后缀数组求的),所以必须要有一个O原创 2013-10-08 11:19:05 · 1189 阅读 · 0 评论 -
hdu 4547 CD操作
题解:开始只用了map,对于找他们的最近公共祖先 是采用并查集向上搜,当两个相遇时就找到了最近公共祖先了,但是时间复杂度太高了。TLE。。。于是就只能用tarjan算法来处理LCA问题了。这里我采用的是tarjan离线LCA算法 + 链式前向星 + map首先,我们要将题目给你的目录转化成一颗树(利用map),然后求出两个目录的最近父目录在树中的深度,以及我们要转的这个目录的深度,两者原创 2013-10-06 17:28:28 · 1760 阅读 · 0 评论 -
hdu 4541 Ten Googol (水题)
题解:根据字符个数制表如下:3:1, 2 ,6 ,10 4:0, 4, 5 , 95:3, 7, 8, 40 ,50 ,60 6:11,12, 20, 30, 80 ,907:15 ,16 ,708:13, 14 ,18, 19 ,41 ,42 ,46 ,51 ,52 ,56 ,61 ,62 ,669:17 ,21 ,22 ,26 ,31 ,32 ,36 ,44 ,4原创 2013-10-06 12:05:48 · 849 阅读 · 0 评论 -
hdu 1142 A Walk Through the Forest
WA了好多次了,大概是一直没搞清题意。题意:对边,如果a到终点的距离小于b到终点的距离,那么b就可以到a,但是a就不能到b了,所以经过这样的一种筛选的方法之后,我们要在这样的图里寻找能从起点走到终点的路径的总数。思路:先算出每一点到终点的最小距离;然后dfs记忆化搜索路径总数。#include #include #include #include #include原创 2013-09-18 11:06:41 · 712 阅读 · 0 评论 -
hdu 1495 非常可乐 (bfs)
小记:这题给我留下了一个TLE的印记,之前因为用的标记数组是int型的,导致了一直TLE,唉,memset一个int型数组浪费的时间真多,不然我之前的那个没用结构体的直接bfs的应该可以A过去,唉,又,b了。一般在写代码前都会先分析自己的算法的时间复杂度的大小,而觉得可以的,动手写了之后还是超时,要么就是你的想法错了,要么就是你的优化剪枝不够,而对于常数级优化 则是没必要的。谨记。。。原创 2013-06-07 21:20:03 · 688 阅读 · 0 评论 -
HDU 2570 迷瘴 (贪心)
题解:根据题意,我们只要先从小到大排个序,然后从第一个小的开始,因为体积相等,所以只需要管百分比就可以了,一个一个的贪心,将百分比一个一个的相加,这个值除以相加的个数,就是此时混合溶液的浓度w%,只要判断浓度是否大于解药浓度,若大于着就可以不用相加,将此值输出输出浓度和体积,体积为个数乘以V,浓度为w%.之所以要排序的原因就是,例如这样一种情况的输入3 100 5049 53 1这原创 2013-05-12 20:59:58 · 841 阅读 · 0 评论 -
hdu 2844 Coins(多重背包)
多重背包,是一个将背包装满的问题,所以在设初始值时,要将其设为无穷小即可,这里我是用我自己的想法,初始值仍然是0,这里可以理解装满的问题,我设初始值为0那么加了那些值之后,只要是能用那些硬币表示出来的数就一定会出现在f[]数组值里,而m表示这些硬币要凑出的数,所以f[m]如果等于m的话那么它就能凑出m这个数,否则就必不会等于,因为这里我们是将它的体积和价值视为一样的,即都是硬币的面值。这里理解清楚原创 2013-04-05 21:34:05 · 859 阅读 · 0 评论 -
HDOJ 2571 命运 (基础dp)
命运Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5682 Accepted Submission(s): 2012Problem Description穿过幽谷意味着离大魔王lemon已经无限接近了原创 2013-04-03 15:10:53 · 905 阅读 · 0 评论 -
hdu 2501 Tiling_easy version (水题)
题解:dfs打表 代码:#include #include #include using namespace std;const int MAX_ = 50;int dp[MAX_];int dfs(int n){ if(dp[n])return dp[n]; if(n == 1)return dp[n] = 1; if原创 2013-10-06 09:33:14 · 1424 阅读 · 0 评论 -
HDU 1595 find the longest of the shortest
题意:对于题目给定的一个图,问去掉起点到终点的最短路径上的某一条边之后起点到终点的最短距离里的最大值。思路:先计算原图的最短路径,保存最短路径。枚举最短路径每一条边,删掉该边,然后计算最短路径,保留最大的那个即可。实现:先用一个spfa求得最短路径,用一个路径数组保存路径。然后枚举每一条路径上的边,用另一个spfa实现对该边的假删除(即对其进行标记,表示现在删的是此边)。然后比较得出最长的原创 2013-09-18 12:58:00 · 626 阅读 · 0 评论 -
hdu 1150 Machine Schedule
二部图问题:每个任务的两种模式对应一条边,那么最大的匹配数就是最多的任务不用改变模式的任务数。相当于求最小点覆盖,而最小点覆盖= 最大匹配数 代码:#include#include#include#includeusing namespace std;#define MAXN 110int uN,vN;int map[MAXN][MAXN];in原创 2013-09-18 11:20:48 · 779 阅读 · 0 评论 -
hdu Circular Area
计算两圆相交 的面积。参考文章:http://blog.sina.com.cn/s/blog_850498e20100w6fq.html #include #include #include #include using namespace std;#define INF 0x3fffffff#define MAXN 100001#define原创 2013-09-12 10:21:58 · 895 阅读 · 0 评论 -
hdu Polynomial Problem
有点杂乱无章,考虑各种情况就行了。 #include #include #include #include using namespace std;#define INF 0x3fffffff#define MAXN 100001int main(){ int n,m, x, flag, mul, ans; char str[MAXN原创 2013-09-12 09:53:13 · 812 阅读 · 0 评论 -
hdu 2227 Find the nondecreasing subsequences (树状数组+dp+离散化)
题意:给定一个长度为n(n 对于某些序列中的递增序列的个数是可以用dp来求解的,其状态转移方程为:dp[i] = sum(dp[j]) + 1,j 根据状态转移方程可以得知这样dp的时间复杂度为O(n^2),而对于题目给定的10^6的数量级来说,这样dp是不行的。那么我们根据a[j]因此我们想到了树状数组,而对于题目给的a[i]元素的大小,a[i] 我们发现总共的元原创 2013-08-28 13:27:48 · 913 阅读 · 0 评论 -
hdu 3718 Similarity (二分图KM算法)
解题思路:二分图。建图:将学生的答案所映射的正确答案作为二分图的边,边权值为1,有两条就为2,依此类推。然后用KM算法求出最佳匹配。除以n 就是要求的答案了。#include #include #include using namespace std;#define N 101#define MIN -0xfffffff#define MAX 0xfffffff#原创 2013-08-15 15:38:24 · 1070 阅读 · 0 评论 -
hdu 2209 翻纸牌游戏 (状态bfs解)
小记:A了这题又长了记性了。定了个全局变量又定了一个相同变量名的局部变量,一直测试不对,想法是肯定是对的。最后想了好久,终于看到了,唉,,b了。题解:这题,因为只有0和1两种状态,而且题目也说了只有不超过20位的长度,因此我们可以将这个串转换成一个整数值,而每种翻转而成的状态都是唯一的,因此这个值也是唯一的,这个就很好的解决了搜索中某个状态是否搜索过的问题了。不过也是利用空间换时间,看原创 2013-06-06 14:30:03 · 1474 阅读 · 0 评论 -
hdu 4505 小Q系列故事——电梯里的爱情 (水题)
水题不多说,电梯要上去也要下来所以最高层乘以10就是上下所要的时间,再加上每个人出去的时间,每人一秒,有多少个不同层数的就要开多少次门,时间在不同层数上乘以5即可,将上面的时间相加 就是总时间了。代码附上:#includeint i,c,n,f[101],max,sum;int main() { scanf("%d",&c); while(c--) {原创 2013-05-14 23:29:20 · 1200 阅读 · 0 评论 -
hdu Max Sum 1003
Max SumTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 103058 Accepted Submission(s): 23691Problem DescriptionGiven a sequenc原创 2013-04-16 21:34:49 · 1302 阅读 · 0 评论 -
hdu Jungle Roads(水题,prim)
思路:map+primmap 用count(),find()方法判断键值是否存在。这里有三篇文章可看看:http://www.360doc.com/content/13/0912/18/3373961_314006267.shtmlhttp://www.cppblog.com/09212744/archive/2010/06/19/118235.htmlhttp原创 2014-02-22 20:06:43 · 756 阅读 · 0 评论 -
hdu 2660 Accepted Necklace(dp)
小记: 这题一看 就是dp,但是出题的时候 一同学说都是搜索题,刚开始我用一维dp,发现不行,因为有两个约束条件,我就将dp删了,用dfs做,就情况来说,想的头痛,然后认真分析,这是一个典型的0/1背包,只不过要用个二维数组,约束两个条件,于是一个三重循环,直接AC了。思路:dp,三重循环,第一重枚举石头,第二重枚举重量,第三重枚举石头个数,因为每种石头只有一个,所以重量和石头个数都是原创 2014-03-09 14:29:57 · 1107 阅读 · 0 评论 -
hdu 4514 湫湫系列故事——设计风景线(dfs)
小记: 最开始读不懂题,然后看了下discuss里,原来是求判环,若没环则求森林里的树的最长直径(后来才知道一棵树里距离最远的两点的距离叫树的直径),看了之后,最开始想到了并查集判环,但是后面想不到如果求树的最长直径了,于是沉思良久,dfs可以做到.思路:对于dfs的某一点,我们保存它两个数据,因为是一棵树,所以对于其中一个点,以它为起点,dfs的某两个终点,通过这个起点,这一条路径就原创 2014-03-15 22:36:14 · 1097 阅读 · 0 评论 -
hdu 1075 What Are You Talking About (Trie树,水题)
小记:这题练的是对Trie树的运用,对火星文字符串建树,每个火星单词标记它为对应英文单词。这题就是对Trie节点多添加一个信息,然后是字符串的处理,练你码字的能力和基础了。1A,很幸运。 这题因为只有一个测试用例 所以可以不释放开辟的空间,因此速度会快点,我不释放是250MS,释放是300多MS。贴上释放代码:#include #include #include #inclu原创 2013-05-31 22:48:45 · 713 阅读 · 0 评论 -
hdu 2813 One fihgt one(trie树+KM算法)
小记:记得这题之前肯定有做过一次,不过那时候肯定没怎么用心做,所以现在原创 2014-04-29 15:40:18 · 744 阅读 · 0 评论 -
hdu 1054 Strategic Game(树形DP||二分图)
小记:因为之前就已经做过这道题了,然后做题的周训上,又出了这道题,我脑子里有印象肯定做过,所以这道题没去想。没做。然后今天进hoj看了下,果然提交过,A了的。又因为昨天周训训的是dp,而我看了下我提交的代码是二分图做的,而题目显然是一道非常典型的树形dp,二分图我想不起来为什么二分图的解除以2是正解,因为是训练dp所以自己又动手码了树形dp,真经典,代码都很简单,1A啊。思路:树形dp原创 2014-03-30 15:16:43 · 663 阅读 · 0 评论 -
hdu 1158 Employment Planning (dp)
小记:这题的转移方程 需要动脑,奈何想不到,就做不到。我还是看了一下别人的dp[i][j] 的意思,然后转移方程自己写出来了。 唉,dp就是定义和转移方程难想。无后效性,和最优解,这两个必须满足,才能动用dp。思路:dp,每个dp的转移方程若是不是自己想出来的,那么这道题,个人觉得收获已经不会大了。dp[i][j] 表示前i个月,在第i个月的时候有j人的最小花费。转移方程:dp原创 2014-03-30 16:28:31 · 756 阅读 · 0 评论 -
hdu n皇后问题 (dfs)
小记:c语言经典问题,细细想来还是 蛮耐人寻味的。思路:对列深搜,就可以看每一列到底在哪一行 放皇后, 然后斜列上的点的坐标满足 一个等式, 用三个数组即可标记。详情可看代码的数组解释。代码;#include #include #include #include using namespace std;const int MAX_ = 11;const原创 2014-03-09 13:17:12 · 961 阅读 · 0 评论 -
hdu 1728 逃离迷宫(bfs)
小记:这题题意开始理解出错了,然后一直WA,TLE,我以为只要在一条水平或垂直线上走就不算转弯次数, 然后就是在每一点可以从各个方向进入,但是必须是不同方向才能入队。我就是认为水平或垂直不算转弯次数,所以一直TLE,对每点保存的是最小需要转弯的次数,最开始我太天真了,直接是以点坐标判重的,后来WA后,想通了。思路:bfs 每点需要最小的转弯数,判重的方法是对每点记录需要的转弯数,保留最原创 2014-03-09 11:22:22 · 914 阅读 · 0 评论 -
hdu 1058 Humble Numbers (set)
小记:没做之前,一实验室的学弟问了我,他用的是set,然后前面的数据基本上全对了,就是后面的answer不对。我看了一下他的代码,发现没什么问题,一下子也没想出来。然后刚刚自己试了一下,稍微将赋值操作简化了下,结果就全对了,之前还一直以为是set的问题,看来set的用法是必须注意,一个不小心就完成不了自己想要的结果。思路:因为set是有序的且里面的元素不重复,使用的是RB树,所以利用这原创 2014-03-30 11:47:59 · 683 阅读 · 0 评论 -
hdu 4501 小明系列故事——买年货(三重dp)
小记:真是艹,自己想到了两重dp还写出了状态转移方程,在k的处理我本来是打算dp求完之后,剩下的最大的前k个 加上dp最大值 就是答案,但是那剩下的前k个不晓得怎么搞,所以两重我是解决不了了。 想了我头痛了,百度了一个题目,看到了四个字,立马就顿悟了啊。。。。三重dp!!!日后对于dp的题目还是要多做做,这就是做题不足的后果,再加一重即可,都没有想到,肯定是没加状态,我相信在比赛的时候有专注buf原创 2014-03-30 20:52:15 · 811 阅读 · 0 评论 -
hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(dp多重背包)
小记:这里我是直接套用多重背包的模板直接A的,0/1,和完全背包还算记得,多重的之前记的是利用0/1和完全背包的2进制解法,现在记不太清了,码不出来,所以直接套了模板。思路:多重背包,结合我blog里的一篇背包问题,和 多重背包解决的一个题目里的模板,即可A掉。代码:( 0 ms)#include #include #include #include #incl原创 2014-03-30 12:14:38 · 748 阅读 · 0 评论 -
hdu 1973 Prime Path (bfs)
小记:被0坑了一把思路:bfs最小步数,枚举每一位数,先提前打好素数表。 注意的地方就是0。代码:#include #include #include #include using namespace std;const int MAX_ = 10001;bool vis[MAX_], v[MAX_];int pri[MAX_];int M,n,k;原创 2014-03-09 15:17:41 · 1285 阅读 · 0 评论 -
hdu 1043 Eight(8数码,第三重)
小记:8数码境界还只有第三重,还要继续加油。 做法:第一重,stl + bfs 暴力, 9!数量级,在重复询问的状态下,超时是必然的 第二重,hash + bfs ,自己做hash函数,自己想个hash函数出来,hdu的5秒 这样做 应该能过,poj 1s 就算了 第三重,hash + 反向bfs + 打表, hash 我是用map做的, 同时用m原创 2014-03-08 17:22:10 · 719 阅读 · 0 评论 -
hdu 1254 推箱子(bfs + bfs)
小记: 这种题,思路很容易想出来,但是考你的不是算法,而是你的细心。思路:首先,此题要注意的是你将箱子 挪过去之后,还可以将箱子挪回来,即 你人的位置换了,而箱子的位置没变,相信玩过的人应该深知这个原理,不多阐述。我们用bfs箱子的位置,箱子往一个方向挪动的话,那么我们必须要能达到箱子挪动的方向的反方向的位置,这个时候我们可以用dfs或bfs查看我们当前所在的位置是否可以到达那个位置,若可原创 2014-03-08 14:33:00 · 1110 阅读 · 0 评论 -
hdu 1316 How Many Fibs?(大数,二分)
思路:因为数据规模达到了10^100,所以必须要用大数, 直接用java的大数应该能比较快的A掉,这里我用的是C++ 模拟。第一步,将斐波那契数 打表,因为增长速度很快,10^100级别的斐波那契数 大概在数列的500左右的样子,第二步,对输入数据a,b分别在表中二分出其大概所在的位置,这个二分要注意点,因为你要据此计算出答案来,所以必须自己考虑清楚。因为斐波那契数列的个数不多,也可以直接原创 2014-02-22 17:21:07 · 741 阅读 · 0 评论 -
hdu 2048 神、上帝以及老天爷(水题,递推,错排)
思路:利用错排公式:F(n) = (n-1)*[F(n-1) + F(n-2)]错排原理:假设前面n-1个元素全部已经错排好,有F(n-1)种,那么可以将前面n-1个元素中任意一个与第n个元素互换,可以生成n个元素的错排,这样有(n-1)*F(n-1)种方法; 此时,若与第n个元素互换的那个元素,它不放在第n个元素所在的位置,而放在除了它和第n个元素的位置之外的其他n-2个位置原创 2014-02-21 20:55:30 · 879 阅读 · 0 评论 -
hdu 2512 一卡通大冒险 (水题)
题解:组合数学的知识,推理一下即可。 #include #include #define N 2001int total[N][N];void compute_total(){ int i,j; for(i = 0; i < N; i ++){ total[i][0] = 0; total[i][1] =原创 2013-10-09 10:41:01 · 1357 阅读 · 0 评论 -
hdu 1195 Open the Lock (bfs)
题意:给定两个四位数,一个代表密码的初始状态,一个代表密码的开锁状态。对于四位数中的任意一位,可以将其减一或者加一,数字只是1到9,没有0,如果是1,要减一的话,就变成了9,相反,9要加一的话,就变成了1.还可以将两个相邻的位交换,但是最左的位不能和最右的位交换,最右和最左亦然。每改变一次算一步操作。问给定这两种状态,从初始状态到开锁状态最少需要多少步操作? 题解:bfs求解所有状态,最先原创 2013-10-09 10:37:29 · 685 阅读 · 0 评论 -
hdu 3308 LCIS
题意:给定一个数组,可以对数组进行两种操作,一、修改某一个数组元素的值,二、查找某一段[a,b](a,b为数组元素下标,a题解:因为时间只有2S,朴素算法是O(1)的修改,O(n)的查找,而对于10^5的数量级来说,2s是不够的。因此必须要将O(n)的操作复杂度去掉,至少得O(logn),这样我们就至少能得到一个O(m*logn)的时间复杂度的算法,对这个数量级,在2s内是可行的。原创 2013-10-07 17:29:35 · 781 阅读 · 0 评论 -
hdu 2852 KiKi's K-Number (树状数组)
题意:给定一个容器,里面存放各种数值,规定三个操作,一个是在容器中增加一个数值,一个是在容器中删掉一个数值,一个是询问容器中比a大的数中第k大的数,将其输出。如果在删除过程中没有这个数,则输出"No Elment!",如果容器中没有比a大的第k个数,则输出"Not Find!". 此题因为是增加和删除元素的值,所以比较容易往树状数组的方向想,用树状数组当容器。采用一个标记数组来标记某个数值原创 2013-08-26 12:21:55 · 1491 阅读 · 0 评论 -
hdu 2688 Rotate (树状数组)
题意:给定一串数字,支持查询和旋转两种操作,查询是查询在经过前面的一些操作之后形成的现在这个序列里的顺序对数,旋转是对给出的[s,t]这一段进行旋转,是将s位置的元素移至t元素的后面,这样会形成一个新串,然后继续操作,直至没有操作。对于求逆序对数和顺序对数,我们可以想到树状数组来快速求解,因为题目给出的数据量是百万级,而时限是1s,那么O(n^2)是肯定不行的。所以用树状数组我们就可以原创 2013-08-25 17:00:29 · 1181 阅读 · 0 评论