2013年6月16日

HDU 2544 最短路

摘要: 题目见此:http://acm.hdu.edu.cn/showproblem.php?pid=2544用来熟悉Dijkstra算法的好题解题思路:Dijkstra+优先队列优化如果把第14行去掉时间用时会多15ms贴代码: 1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 using namespace std; 5 6 const int MAXN = 101; 7 const int INF = 0xfffffff; 8 struct Node 9 {10 int to, va 阅读全文

posted @ 2013-06-16 14:51 白~ 阅读(117) 评论(0) 推荐(0)

HDU 1874 畅通工程续

摘要: 题目见此:http://acm.hdu.edu.cn/showproblem.php?pid=1874解题思路:典型的最短路径,用Dijkstra+优先队列优化注意一点:道路是双向的,且两个城市之间可能有多条双向路,但这里我没有预处理,用vector来find一下其实也挺麻烦的,如果重复多的话应该预处理贴代码: 1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 #include <iostream> 5 using namespace std; 6 7 const in 阅读全文

posted @ 2013-06-16 14:47 白~ 阅读(94) 评论(0) 推荐(0)

2013年6月3日

POJ 1821 Fence

摘要: 题目见此:http://poj.grids.cn/practice/1821这道题想了一晚上啊,结果连最朴素的dp方程都列不出来……差距额于是第二天看了很多人的解题报告,看完还是半懂不懂,不过最后看这个看懂了:http://www.abandonzhang.com/archives/554(下面是脑残型详解)解题思路:这题看上去比较像背包,不过如果直接套背包模板肯定是不行的。这题比较容易想到的是有两个状态,dp[i][j]表示考虑了i个工人在第j个位置。比较难的是处理j与s[i]的位置关系。首先要明确一点,j表示第j个位置,就是说我们只考虑包括j之前的位置,也就是说,我们要把j看成是我们的视野 阅读全文

posted @ 2013-06-03 19:26 白~ 阅读(150) 评论(0) 推荐(0)

EOF 440 Buying Feed (未提交)

摘要: 囧……在EOJ里怎么找不到提交的地方?求问,哪里有提交这道题的地方?不过把代码写出来了 1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 struct MQ 6 { 7 int pos[101]; 8 long long val[101]; 9 int head, tail, winlen;10 void reset(const int& _winlen)11 {12 head = 0, tail = -1, winlen = _winlen;... 阅读全文

posted @ 2013-06-03 18:25 白~ 阅读(120) 评论(0) 推荐(0)

2013年6月2日

POJ 1742 Coins

摘要: 题目见此:http://poj.grids.cn/practice/1742传说中的男人八题解题思路:第一反应当然是多重背包了,不过写了一个没有优化的直接超时,果然是男人八题之一额~于是用单调队列优化,AC后来上网一查,原来还可以有简单方法。这道题跟其他背包还比较不一样,是要找有几个合适的,而不是求最优解。用f数组表示总共j的钱可不可以被组合出(bool),初始化为f[0]=1,f[其余]=0;再用use_count[j]数组表示当我们用到c[i]面值的银币时,组合出j的钱需要用到的c[i]的次数(拗口~),对每一个c[i]都把它初始为0。当我们想用到c[i]面值的银币时,我们把所有可能用到c 阅读全文

posted @ 2013-06-02 18:39 白~ 阅读(149) 评论(0) 推荐(0)

PKU 1276 Cash Machine

摘要: 题目见此:http://poj.grids.cn/practice/1276解题思路:一看就是多重背包,没什么说的了……一开始不会单调队列优化,后来写了个优化了,可以对照着看看,加深理解未用单调队列优化: 1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 #define sum(a, b) a+b 5 const int MAXN = 11, MAXV = 100010; 6 int f[MAXV], c[MAXN], w[MAXN], n[MAXN], N, V; 7 8 void 阅读全文

posted @ 2013-06-02 18:06 白~ 阅读(135) 评论(0) 推荐(0)

POJ 1014 Dividing

摘要: 题目见此:http://poj.grids.cn/practice/1014解题思路:如果做过几道多重背包的题的话,很明显可以看出是用多重背包,V = 总数/2, N = 6, n数组就是不同大小大理石的个数。我们可以采用“输出方案数”的做法:在背包中用sum,初始化f[0] = 1, f[其余] = 0, 最后只要考察f[V]的值是不是0(方案数是不是0)即可。贴代码: 1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 #define sum(a, b) a+b 5 const i 阅读全文

posted @ 2013-06-02 17:42 白~ 阅读(112) 评论(0) 推荐(0)

HDU 3415 Max Sum of Max-K-sub-sequence

摘要: 题目见此:http://acm.hdu.edu.cn/showproblem.php?pid=3415解题思路:这题一看就和POJ2823很相似,都是要求一段区间内的最大值,不同点有二:这里是循环的,这里是求和最大。方程很明显:dp[i]=sum(i)-min(sum(j))其中{i-K<=j<i},要注意这里是min观察j的范围,符合单调队列的要求,而j小于i,所以把i从小到大循环怎么处理循环呢?处理循环比较简单的方法是扩成二倍数组,这里可以采用这个做法。很明显求和必须要预处理,sum[i]表示到二倍扩充后的数组的i位置前的和,注意这样做的合理性在于我们只关注sum的差,即相对值 阅读全文

posted @ 2013-06-02 17:24 白~ 阅读(158) 评论(0) 推荐(0)

HDU 3401 Trade

摘要: 题目:http://acm.hdu.edu.cn/showproblem.php?pid=3401这个题在http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html中先看了一遍,但是自己写的时候一直WA,原来是预处理没有做好……题目还是要自己做一遍才能理解啊,光看别人代码是看不懂的思考过程:首先看出这是个dp题,然后想状态:肯定有一个表示天数的状态,用i表示;接着我的第一反应是有一个表示买入或卖出的状态,但这个状态的上下限是不定的(跟i有关),接着注意到每天拥有的最多股数是MaxP,所以用就j表示这天拥有的股数。列dp方程:三 阅读全文

posted @ 2013-06-02 16:52 白~ 阅读(135) 评论(0) 推荐(0)

导航