摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1157方法:通过像快速排序那样进行一个划分,划分只对一个部分进行处理而不是像快速排序那样对两个都处理。当随机选择一个元素进行了划分后,开划分的位子k在哪里,如果把x-th元素的x等于k,则直接返回,小于,就在前面一个部分递归下去找地x-th小的元素,否则,x-=k,在后面一个部分去找。在该题目中x为n/2+1.感谢:时间复杂度接近o(n),这是根据概率分布计算出来的,以后要学会其证明,包括快速排序的证明。代码:View Code #include <iostream>#include & 阅读全文
posted @ 2013-04-23 13:59 kbyd 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084方法:是对于每一个塔中第x行第y个位子的地方,设其所累加的最大和F(x,y),当前位子本来就有的数字current(x,y),当前位子处于的行的元素个数cx.则状态转移方程为: { Max(F(x-1,y)+current(x,y),F(x-1,y-1)+current(x,y));F(x,y) = 1, x==1 and y==1; 0, x<0 or y<0; } 感想:简单题。View Code #include<iostream>using n... 阅读全文
posted @ 2013-04-22 14:38 kbyd 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2571方法:建立状态转移方程,设F(x,y)为当前走到获得的最大幸运值,current(x,y)为当前位置本来就具有的幸运值,则方程为: { 0, x<1or y<1;F(x,y) = Max( {F(x-1,y)+current(x,y)}U{ F(x,yi)+current(x,y) |(yi%y==0 and yi!=y)oryi+1==y} ); current(1,1), x==1 and y==1; }在自底向上的时候,需要考虑一个位子列数c的小于... 阅读全文
posted @ 2013-04-22 14:02 kbyd 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2391方法:建立状态转移方程,设F(x,y)为走到x,y点已经获得了的最大黄金数量,curent(x,y)为该点本身具有的黄金数量,则 { 0 , x<1|| y<1;F(x,y)= Max(F(x-1,y)+current(x,y), F(x,y-1)+current(x,y),F(x-1,y-1)+current(x,y));//因为每一个位置最多可以从3个方向到达。 current(1,1), x==1 && y==1; }感想:适合dp入门练习。代码:View.. 阅读全文
posted @ 2013-04-22 13:44 kbyd 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2616方法:深搜树中每一个状态节点包含的信息为:使用武器的标号,怪物还剩余的生命值,以及该节点处于的层数也就是使用了多少个武器。然后分别以每一个武器作为树的根节点以实现暴力深搜。深搜的过程中用到一个很基本的剪枝方法,那就是在搜索过程中维护一个当前已经获取的最优解,该题目中为当前为了消灭怪物使用武器数量最下那个数量MinCount,然后每一个次搜索的时候发现如果再继续搜索很得到次于当前最有解的解,是不会被选择的解,于是再搜索便无意义,所以就剪掉,在该题目中,如果发现当前节点的层数已经大于当前MinCo 阅读全文
posted @ 2013-04-21 21:51 kbyd 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2614方法:就一个很简单的递归深搜,当探寻到一个节点A的时候,表明其可以解答一个题,于是先设置其解答的题目个数是1,然后去以此探寻其子节点,其子节点就是其下一个可以解答的题,可能有多个可以解答的题,于是就用多个子节点,分别递归去计算每一个个子节点下去能接答多少题,去能解答题目数量最多的一个状态子节点的探寻结果和一开始就设置的1相加,得到从该A节点的结果。感想:简单题代码:View Code #include <iostream>#include <queue>#include 阅读全文
posted @ 2013-04-21 21:21 kbyd 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2611方法:和hdu 2610不一样,该题中要求的顺序除了根据长度外是根据数字大小而不是数字所在的下标,所以不像2610那样有现成的顺序在那里我们只需要去扫描就可以了,所以这里要使用优先队列,但如果对所有的状态都用优先队列来放的话,这会带来很大的时间开销所以,本程序的处理是, 1,将当前已经探寻到了状态维护在一个一般队列中,并且保证其入队出队顺序和题目要求一致。 2,当出来一个状态,准备去探索一堆新状态的时候,由于都是同一个状态探寻到的,所以它们携带的数组长度一样,所以这里只需要对大小排序。在由.. 阅读全文
posted @ 2013-04-20 14:40 kbyd 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2610方法:状态收索树中的每一个节点包含如下信息, A.当前数组中的个数。 B.当前数组中最后一个数在原数组中的位置。 C.一个指向 当前数组的指针在指针数组中为值得编号。由于每一个状态节点中的数组长度不定,所有都用int* 来动态为其分配空间。这样在进出队列的时候还可以减少副本开销。每一个状态节点在广搜探寻下一个节点的时候,先从自己当前数组最后一个数在源数组中的位置后第一个位置开始,以下标的顺序不重复地找寻大于等于当前数组最后一个数的数x 以及其下标i,然后,然后给新节点的数组中数字个数赋为... 阅读全文
posted @ 2013-04-20 14:15 kbyd 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612方法:其实就是从两个点分别探寻单源最短路径,两个点到同一个目标位置的最短路径都求出来,相加,然后找出到哪一个相同目标位置的最短路径之和最小即可,采用的模拟dijsktral算法。要注意的一个地方是,找到一个kfc后一定还要继续去找,而不是向其他广搜题那样就停止探寻了,不能有思维定势啊。实现方法为,初始的时候将两个源点到目标位置的距离设置为正无穷,然后分别用单元最短路径的算法模拟广搜并更新到目标位置的距离,最后在目标位置中找到最短路径之和最小的,由于正无穷和任何数之和都是正无穷,所以如果遇到不是 阅读全文
posted @ 2013-04-20 13:33 kbyd 阅读(158) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4528方法:地图输入接收完成后,扫面数组,把所有可以看到D和E的位置都标记了,d表示可以看到D,e表示可以看到E,b表示两个都可以看到,这一步放在广搜前的初始化里面。在广搜时,树中的每一个状态节点有3个信息,图中坐标x y,到当前有没有已经看到D getD,到当前有没有已经看到E getE,和当前使用的时间。探寻到一个状态节点,将不将其放入优先队列,从不从该节点开始广搜判断的依据为改状态所处位子是不是墙或D或E(题目要求不能穿过D或E)已经该状态有没有搜索过。判断一个状态有没有搜索过,主要由一个4维 阅读全文
posted @ 2013-04-18 18:33 kbyd 阅读(451) 评论(0) 推荐(0) 编辑