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)

导航