HDU 3920【状态压缩DP +优化】
摘要:题目:Clear All of Them I题意:有2n个敌人,给出你的坐标和敌人的坐标,让你射n次枪将所有敌人杀死,每一次可以且仅可以射死两个敌人。解题思路:刚开始无任何证明地用了最小生成树提交,wa,然后状态压缩DP,TLE,看了解题报告才知道自己的状态压缩DP写得有点萎,原来可以从O(2^n*(n*n))优化O(n2^n),以前从未想过。View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <cstring> 5 #include
阅读全文
posted @
2011-10-04 20:48
Kenfly
阅读(445)
推荐(0)
HDU 4026【状态压缩DP+判断路径可达】
摘要:题目:Unlock the Cell Phone题意:玩过Android吧,有个叫图案屏锁的。这题求连接所有的点能产生的图案锁的个数。输入n,m表示图案为n*m的规模(n,m<=5),然后输入一个n*m的矩阵g,g[i][j]表示该点的类型,为0时表示普通的点能触点能滑动,但不能跨,为1时这个点不能被点击和滑过,为2时表示这点能跨过但不能触点。求连接所有的普通点能构成多少个图。 p=""> 解题思路:网络赛时没看过这题,如果看了相信会花一个下午的时间钻在这题上,状态压缩DP是我最想征服的类型。这跟哈密顿图的解法差不多,其实就是求哈密顿通路个数吧。DP[i][s]
阅读全文
posted @
2011-09-27 01:08
Kenfly
阅读(697)
推荐(0)
HDU 4028【map离散化DP】
摘要:题目:The time of a day题意:给出一个数N,表示有N条指针,编号1~N,第i条指针旋转一圈所要用的时间是i,从中挑选一些指针,决定一天的长度,这个长度定义为这些指针两次重合的时间间隔。然后给出一个m,求出长度大于等于m的组合数,也就是选择指针的方法数。解题思路:很明显这个长度为挑出指针的最小公倍数。朴素的想法是用递推造出所有的最小公倍数,然后找出大于等于m的。但N最大为40,给合数也有2^N-1个,数组开不下。所幸这些最小公倍数有很多是重复的,经打表什么的发现好像只有10万个不同的最小公倍数。要造出1-i这些数组成的最小公倍数很简单,用个O(N*N)的递推算法。假设前面已造好了
阅读全文
posted @
2011-09-26 11:33
Kenfly
阅读(666)
推荐(0)
POJ 3356【简单DP】
摘要:题目:AGTC题意:如题解题思路:看代码View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 #include <map> 8 9 using namespace std;10 11 const int MAX = 1000 + 10;12 char X[MAX], Y[MAX];13 int
阅读全文
posted @
2011-09-25 19:19
Kenfly
阅读(354)
推荐(0)
POJ 3616【数状数组求区间最大值 + 简单DP】
摘要:题目:Milking Time题意:给出一个数N,表示Bessie在0~N时间段进行挤牛奶工作。然后给出M行数值,每一行为f,t,v,分别表示在时间断f,t内Bessie能挤到的牛奶量。然后给出一个R,表示每次Bessie挤完牛奶都要休息R小时才能继续下一个工作,求Bessie最大的挤奶量。解题思路:很简单的DP,刚开始WA了两次,因为时间两边的界限没处理好。转移式:DP[i] = max{DP[D[j].to], DP[D[j].from - R] + D[j].val},要求某一区间的最大值,可以用数状数组实现。View Code 1 #include <iostream> 2
阅读全文
posted @
2011-09-25 17:39
Kenfly
阅读(852)
推荐(0)
HDU 3591【多重背包】
摘要:题目:The trouble of Xiaoqian题意:有N种coin,给出每种coin的价值Vi,和小强拥有的个数Ci,小强去购物,要付m元,求小强和店员间交换货币时的最小个数货币,即小强付出coin个数加上店员找回coin个数。解题思路:背包题,先用二进制思想把coin合并成和种不同价值的货币,再进行01背包。View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <cstring> 5 #include <algorithm
阅读全文
posted @
2011-09-22 19:11
Kenfly
阅读(297)
推荐(0)
HDU 3586【树形DP+二分】
摘要:题目:Information Disturbing题意:给出一棵树,和每条边的cost值,设置一个界限,要求切断所有叶子结点,切断的边的cost不能超过界限值,并且切断的边的总和不能超过m,求出这个最小界限值。解题思路:很明显的一道树型DP,DP[v],表示切断根结点的v的子树的最小花费,那么这个界限怎么处理呢,由于界限值范围要比总和m小得多,才1-1000,可以用二分枚举,这样在选择切边时可以根据这个枚举值进行判断处理。每个结点v,设其儿子结点为x1,x2,x3...则DP[v] = Min{DP[x1],Node[x1].cost} + Min{DP[x2], Node[x2].cost}
阅读全文
posted @
2011-09-22 18:59
Kenfly
阅读(300)
推荐(0)
HDU 4008【树型DP+树儿子兄弟判断】
摘要:题目:Parent and son题意:输入N,Q,接着输入N-1条边,组成树,结点以1-N命名。然后输入Q个提问,每个提问输入X,Y(X!=Y),表示当以X为树的根结点时,求Y的最小儿子和最小子孙。解题思路:以1为根,进行DFS遍历,DP每个结点的最小儿子和最小子孙,注意最小儿子要包括其father,方便后面处理。有了这些信息后,对每个提问X,Y。分三种情况:s第一种情况:当Y==1时,X肯定是Y的儿子。这个要特殊处理,因为上面获得信息不能取得其最优解。因为DFS结果的最小子孙sx有可能跟x在同一棵子树上,那么当以X为树根时,Y的最小子孙肯定不是sx。所以结点1要预先处理。找出其最小的子孙s
阅读全文
posted @
2011-09-15 16:53
Kenfly
阅读(772)
推荐(1)
HDU 4003【树型DP+背包】
摘要:题目:Find Metal Mineral题意:给出一棵树,选择一个s点为根,最多给出k个机器人,从根结点开始,求遍历所有的结点的最小花费。解题思路:树存在递归结构,对每个结点,他和他的后代组成一棵树,且他所有的儿子都是一棵树,则该结点的状态一般由其子树递推而来,每棵子树达到最优时,才能推出根结点的最优解,可采用递归DFS很方便处理。本题可以设DP[n][i]表示结点为n的子树放进i个机器人时的最小花费,其中DP[n][0]特殊,表示放进一个机器人又返回了该结点,结点n的所有儿子结点为DP[si][i],难点是如何从DP[si][0...k]组合成i从而使DP[n][i]最小,即从每个结点中选
阅读全文
posted @
2011-09-08 23:41
Kenfly
阅读(369)
推荐(0)
POJ 3088【组合数学DP】
摘要:题目:http://poj.org/problem?id=3088题意: 给出一个整数B (1<=B<=11), 表示有1 2 3 ... B 这B个数, 可选择其中的N (1<=N<=B)个数(不用按顺序), 并用若干个括号将它们括起来. 如B = 2 时: 有 (1), (2), (12), (1)(2), (2)(1) 这5种情况 要求出所有情况的总数.解题思路: 看懂题意后, 马上做的是找算公式找规律, 但式子很复杂. 半途而废了. 后来找出了一条DP式如下: 设D[i] 表示有 i 个数时可以组成的所有情况总数 那么有 D[i] = C(i...
阅读全文
posted @
2011-05-05 01:32
Kenfly
阅读(381)
推荐(0)
HDU 2870【DP_求最大矩阵】
摘要:题目:http://acm.hdu.edu.cn/showproblem.php?pid=2870题意:给出一个字符矩阵Matritx[][], 求其最大子矩阵, 详细如题.解题思路: 将全部字符依次转化a, b, c, 再分别求出这三个矩阵的最大子矩阵即可. 于是, 问题转化为求矩阵中最大的子矩阵了. 设置一个变量Num[][]记录位置的最大高度, Num[i][j]表示Matritx[i][j]位置上的最大高度 这样, 只要枚举以各个Num[i][j]为矩阵最小高度, 分别向前后推进扩展矩阵, 如果Num[i][j + 1] >= Num[i][j]则可以向前扩展, 同理Num[i.
阅读全文
posted @
2011-04-18 18:42
Kenfly
阅读(988)
推荐(0)
HDU 1074【状态压缩DP】
摘要:题目: http://acm.hdu.edu.cn/showproblem.php?pid=1074题意: 学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一天则扣掉一单位学分, 要你求出完成所有作业而被扣最小的学分, 并将完成作业的顺序输出.解题: 刚开始以为是背包, 但背包难以记录输出顺序, 所以只能换另一种DP方式, 这里科目最大数目才15, 只要有全枚举的思想来DP就可以解决了, 有一个专有名词叫状态压缩DP. 状态压缩DP采用二制进的思想, 1, 0分别代表有或否. 如: 3的二进制为 11, 则代表完成了每一,二个科目的...
阅读全文
posted @
2011-03-30 22:45
Kenfly
阅读(3364)
推荐(1)
USACO_humble
摘要:1 /* 2 ID: Kenfy21 3 PROG: humble 4 LANG: C++ 5 */ 6 /* 7 题意: 给出一个素数的集合{p1, p2, p3}, humble numble 的定义是p1, p1*p2, p1*p3, p1*p1,p1*p2*p3...... 8 输入:k(素数个数), n 9 然后输入k个素数, 让你求出第n个humble numble的值(按从小到大顺序)10 11 解题思路: 这是一道比较经典的动态规划题目. 如果我们求出第i个humble numble, 则第i+1个humble numble的值为各个素数与前边i个所求12 13 出的humb.
阅读全文
posted @
2011-02-18 13:08
Kenfly
阅读(300)
推荐(0)