andre_joy

导航

随笔分类 -  HDOJ

1 2 3 4 5 6 下一页

hdu 1863
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=1863题意:中文。。。mark:继续看题解。。神奇的最小生成树+并查集,算法名字叫Kruskal。听起来很高深的样子,但是算法理解起来不难,就是遇到这类型的题目,首先存放的是每条边的起点,终 点和权值,然后将所有边按权值的升序排序,然后从最小权值开始查找,用到并查集的方法,只须修改一下并查集里面merge函数,当发现当前边的起点和终点已经可以直接 或间接连在一起的时候,就不用管它,否则就将这两个点通过当前边连接起来,最后判断一下是否所有点都已经连接起来。代码:#include <cstdio... 阅读全文

posted @ 2013-06-01 20:33 andre_joy 阅读(373) 评论(0) 推荐(0)

hdu 1233
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=1233题意:中文。。mark:这就是传说中的最小生成树。。。第一次做最小生成树,看别人题解说是很裸的,思路也很简单。 第一次随便取一个点,比如a1,则集合变成{a1}, {a2, a3, ...},然后从右边的集合找到一个距离左边集合最近的点加入左边,以此重复n-1次。代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream&g 阅读全文

posted @ 2013-05-31 22:37 andre_joy 阅读(331) 评论(0) 推荐(0)

hdu 4512
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=4512题意:中文。。mark:最长升序公共子序列(LCIS)的一个小变形,最长公共子序列具体可以百度。 假设两个字符串为a,b,状态dp[i][j]代表a的前i个字符和b的前j个字符的最大匹配 当a[i] == b[j]时,dp[i][j] = max(dp[i-1][k])+1,k是[0 ... j-1]。 当a[i] != b[j]时,dp[i][j] = dp[i-1][j]。 dp[i-1][k]可以通过维护一个变量实现O(1)的算法,所以时间复杂度优化后是O(n^2),... 阅读全文

posted @ 2013-05-05 11:22 andre_joy 阅读(244) 评论(2) 推荐(0)

hdu 4521
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=4521题意:中文。。mark:看网上大部分解题报告都是用线段树,我又不是很懂线段树,后来突然发现有一个人用变种的LIS做的,顿时来了兴致~ 普通的LIS要求O(nlgn)的算法的时候,需要维护一个栈,每次元素比较当前栈顶元素,如果大,直接放入栈顶,否则二分查找到第一个大于它的数,替换它,具体证明就不说了。。。本题有一个限定条件是,LIS里面的序列在原数组里面的位置是要大于d的,那么解决办法就是延缓入栈(我自己随便取的名字),就是你每次计算当前元素能够组成的最长子串的时候,二分到它之前所能组成的最大... 阅读全文

posted @ 2013-05-04 10:58 andre_joy 阅读(320) 评论(0) 推荐(0)

hdu 2196
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=2196题意:有很多机器通过一棵树连在一起,每条边有一个权值,求每个机器距离最远的路径是多长。mark:这是一个典型的起点不固定的树形dp。我们首先想到的肯定是枚举所有顶点,但是这样计算会有很多重复计算,我们做dp就是为了减少重复计算。 于是我们可以先把它当成一个以任意节点(一般都以编号为1的节点)当根节点做一次dp,dp[i]代表以i为根的子树的最大权值。做完一次后根节点(节点1)肯定已经是最优的了,那么我们现在要想办法更新其他的节点,假如现在要更新节点1的儿子节点son,那么我们首先要计算出除了... 阅读全文

posted @ 2012-10-11 09:59 andre_joy 阅读(799) 评论(0) 推荐(0)

hdu 1520
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=1520题意:举办一个party,候选人当中有很多人之间有上下级关系,求没有直接上下级的最多的人数。mark:简单的树形dp题,从每个人的状态着手考虑,每个人要么参加,要么不参加,那么状态dp[i][0]代表参加,dp[i][1]代表不参加。 dp[i][0] += dp[son][1]; dp[i][1] += max(dp[son][1], dp[son][0]);代码:#include <stdio.h>#include <string.h>#include <stdl 阅读全文

posted @ 2012-10-11 08:04 andre_joy 阅读(360) 评论(0) 推荐(0)

hdu 4003
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=4003参见大牛的博客吧http://blog.csdn.net/woshi250hua/article/details/7648099mark:写一点我的总结。 因为该题题目要求的是每个点都必须至少走一次。状态我自己是没想出来,根据大牛的状态。dp[v][0]可以理解为一个机器人跑以v为根节点的分支并回到v点。代码:#include <stdio.h>#include <string.h>#include <stdlib.h>const int N = 10010;s 阅读全文

posted @ 2012-10-10 22:35 andre_joy 阅读(359) 评论(0) 推荐(0)

hdu 1561
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=1561题意:要攻克一些城堡,有些城堡可以直接攻克,有些必须要先攻克一个指定城堡才能攻克他。每个城堡里面有一些宝物,求攻克m个城堡的最大宝物数。mark:该题用到一个很实用的技巧就是题目给定的是一片森林,那么我们为这些根节点建立一个共同的根节点,那么就变成一棵树了。 常规树形dp解法。dp[i][j]代表第i个节点为根节点的节点个数为j的最大价值。则dp[v][1] = w[v];(v是叶子节点) dp[i][j] = max(dp[i][j], dp[i][k]+dp[son][j-k]);... 阅读全文

posted @ 2012-10-10 22:15 andre_joy 阅读(837) 评论(0) 推荐(0)

hdu 3535
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=3535题意:混乱背包,s=0,至少选一种,s=1,最多选一种,s=2,随意选。mark:分别三种情况背包。初始化的时候不能直接把dp[i-1][j]赋值给dp[i][j],必须取最大值。代码:#include <stdio.h>#include <string.h>#include <stdlib.h>const int N = 110;int n,t,m,s;int v[N],w[N];int dp[N][N];int i,f;int max(int a, int 阅读全文

posted @ 2012-10-02 01:37 andre_joy 阅读(156) 评论(0) 推荐(0)

hdu 3810
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=3810题意:dota里面敌法师有一个技能blink,就是瞬间移动,而且没有CD。给定很多地方,有些距离比较近的地方是可以相互瞬间移动到的,问能否在达到给定金钱,并求出最小时间。mark:本题把能够相互到达的可以看成一部分,那么就分成很多部分,每个部分没有任何联系,相互做一次01背包,取最小值就好的。 但是问题的关键是本题数据很大,背包容量最大是10亿,时间虽然是30s,但是直接扫肯定是不行的,本来我们是可以用队列的方式解普通的01背包,但是我们用队列跟直接用数组花费空间是一样大的,所以我们需要想办... 阅读全文

posted @ 2012-10-01 19:06 andre_joy 阅读(319) 评论(0) 推荐(0)

hdu 3033
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=3033题意:一个人买商品,必须每个种类的商品至少买一件,同时保证买到的价值尽可能大,如果不能满意,输出Impossible。mark:分组背包的变种,普通分组背包是一个组里面最大取一件,这题是至少取一件。 设计状态dp[i][j]代表前i组容量为j的最大价值。由于一组里面有多个物品,所以状态转移可以是前一组少取一个,即dp[i-1][p-g[i][j].v]+g[i][j].w,也可以是当前组之前去过的少取一种,即dp[i][p-g[i][j].v]+g[i][j].w。 网上有些解题报告是... 阅读全文

posted @ 2012-09-28 21:41 andre_joy 阅读(372) 评论(0) 推荐(0)

hdu 1712
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=1712题意:复习课程,n们课,有m天复习,a[i][j]代表用j天来复习第i门课的收获。。(这里居然可能用的天数多而收获更少……囧)mark:第一个分组背包。对于每个i最多只能选一个j,或者不选。代码:#include <stdio.h>#include <string.h>#include <stdlib.h>const int N = 110;int w[N],dp[N];int max(int a, int b) {return a > b ? a : b 阅读全文

posted @ 2012-09-26 13:51 andre_joy 阅读(147) 评论(0) 推荐(0)

poj 3181
摘要:地址:http://poj.org/problem?id=3181题意:类似分硬币,给n,m,钱是n,有m中硬币,分别是1~m,求多少种分法mark:普通的完全背包不行,会超long long,需要一点高精度的技巧,会大数加法就没问题了。代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream>#include <algorithm>#include <map>#define LL lon 阅读全文

posted @ 2012-09-21 20:14 andre_joy 阅读(163) 评论(0) 推荐(0)

hdu 2126
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=2126题意:n种物品,给每种物品的价格,自己的钱m,求在满足买的最多个数情况下有几种方案。mark:01背包扩展一下,三维,dp[i][j][k]代表前i种物品,买j个,价值最多为k时的方案数。递推关系式很容易得到。 这是本题排名第一的大牛的博客http://blog.csdn.net/haha593572013/article/details/7869411 之所以可以根据他的第二种方法设计状态,即dp[i][0]代表用最多用i的钱购买数量最多的物品,dp[i][1]代表在购买最多物品的情... 阅读全文

posted @ 2012-09-20 21:51 andre_joy 阅读(466) 评论(3) 推荐(0)

hdu 3466
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=3466题意:买东西,每个东西有三个特征值,p代表价格,q代表你手中钱必须不低于q才能买这个物品,v代表得到的价值。mark:又是变种01背包,每做一个变种的,就是一种提高。。 这题因为涉及到q,所以不能直接就01背包了。因为如果一个物品是5 9,一个物品是5 6,对第一个进行背包的时候只有dp[9],dp[10],…,dp[m],再对第二个进行背包的时候,如果是普通的,应该会借用前面的dp[8],dp[7]之类的,但是现在这些值都是0,所以会导致结果出错。于是要想到只有后面要用的值前面都可以得到,那.. 阅读全文

posted @ 2012-09-20 19:52 andre_joy 阅读(891) 评论(0) 推荐(0)

hdu 2955
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=2955题意:抢银行,给出每一个银行的钱和被抓的概率,被抓的总概率低于p才能顺利逃脱,求最多偷多少钱。mark:01背包的转换,需要把偷的钱当作w来考虑。代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream>#include <algorithm>#include <map>#define LL 阅读全文

posted @ 2012-09-19 15:04 andre_joy 阅读(131) 评论(0) 推荐(0)

hdu 4293
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=4293题意:一行人行走,分成很多组,每个人要说出他前面和后面分别有多少个人,他自己团队的人可以忽略,问最多有多少人说真话了。mark:学习了大牛的思路,真是没话说。。想不到……大牛的思路是dp[i][j]代表前i个人并且i+1到j个人是一个团队的时候,最多有多少人说真话。 http://blog.csdn.net/taozifish/article/details/7985044 我在研究了他的代码之后,发现代码可以优化,优化之后顿时有一种豁然开朗的感觉,我知道为什么会这样想了。 dp[i]... 阅读全文

posted @ 2012-09-17 20:34 andre_joy 阅读(169) 评论(0) 推荐(0)

hdu 4291
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=4291题意:g(n) = 3*g(n-1)+g(n-2),求g(g(g(n)))。mark:本地打表找循环节。。。囧,第一次做这种题。找到后直接快速幂。代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream>#include <algorithm>#include <map>#define LL 阅读全文

posted @ 2012-09-16 22:03 andre_joy 阅读(268) 评论(0) 推荐(0)

hdu 4284
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=4284题意:给出一些城市,从1出发,旅游一圈回到1,由于花费可能不够,所以选择一些城市打工,打工之前需要花费d买一个证,工资为c。选中的城市必须去工作一次,而且只能工作一次,问能不能完成旅行mark:先用floyd预处理,记住一定要把断点放在最外层循环!!!状态压缩dp。代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream& 阅读全文

posted @ 2012-09-12 16:44 andre_joy 阅读(99) 评论(0) 推荐(0)

hdu 4283
摘要:地址:http://acm.hdu.edu.cn/showproblem.php?pid=4283题意:一些人排好序,然后先进黑屋子,然后再出来去舞台,黑屋子是相当于一个栈,先进后出,每个人去舞台都有一个不开心值,求不开心值最小的做法。mark:记忆化搜索。代码:#include <cstdio>#include <cstring>#include <cstdlib>int min(int a, int b) {return a < b ? a : b;}const int INF = 10000000;int d[110], sum[110][110 阅读全文

posted @ 2012-09-11 21:56 andre_joy 阅读(332) 评论(0) 推荐(0)

1 2 3 4 5 6 下一页