贪心算法
1.基本思路:
即从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。
该算法存在问题:
1. 不能保证求得的最后解是最佳的;
2. 不能用来求最大或最小解问题;
3. 只能求满足某些约束条件的可行解的范围。
求解:去逼近目标,每一步都是最优解,最终得到最优解的集合。
停止:不能再继续前进。最优解得出不是最佳(这个似乎很简单啊),最大最小解问题不行(什么是最大最小解),只能求满足某些约束条件的可行解
贪心策略一旦经过证明成立后,它就是一种高效的算法。
先得知道什么时候才能用它
2.贪心算法适用的问题(前提)
实际上,贪心算法适用的情况很少。
贪心算法的证明围绕着:整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的。
3.框架
从问题的某一初始解出发;
While(朝着给定的总目标前进一步)
{
利用一些可行的决策,求出可行解的一个解元素;
}
有所有解元素组合成问题的一个可行解;
问题:如何判断是否可以用贪心;
严格的证明 可使用
有反例就是 不能用
贪心算法的一个充分必要条件:矩阵胚拟理
通过题目理解贪心
1.来吃
HDOJ.1257 最少拦截系统
我感觉这个例子非常好的解释贪心。
如果一个拦截系统能拦截当前的导弹,那么就让他拦截,如果可能的话,导弹高度一直降低,就让他一直拦截,直到他不能拦截新的导弹,再建立新的导弹系统。可以抽象的理解为有一个人一直吃,直到他吃不下了为止。
2.高性价比
HDOJ.1070 Milk
这个例子也很好。
想要保住更多的粮食,那么久要选择性价比高的房间,即花最少的猫粮就能获取更大的收益。你看多贪。根据性价比排序优先选择性价比高的即可。
与这个例子差不多的
HDOJ.2187 悼念512汶川大地震遇难同胞——老人是真饿了
只不过是换了个情景,这个是买大米而已。还有下面这道也是一样的,换个故事,不过换汤不换药。
HDOJ.2111 Saving HDU
3.时间区间
HDOJ.2037 今年暑假不AC
这道题有意思,要求能看的完整节目时间多。那么节目结束时间越早,能看的东西不就是越多了吗?所以只需要按照结束时间升序排列就好(结束时间早意味着开始时间也早)。然后依次和后面的比较即可。
4.多重标准的来吃
HDOJ.1051 Wooden Sticks
加工小木条。如果加工过木条的l和w均比下一个大,那么就不用准备时间了。和来吃的模型一模一样嘛,只不过是双重标准而已。思路也很简单,重复找那个能吃的人,让他把能吃的都吃了,然后再找,看看最后有几个这样能吃的人就好了。
5.重叠问题(包括重叠区间)
HDOJ.1800 Flying to the Mars
小女巫骑扫帚。等级高的可以教等级低的。教过后能一起骑一个扫帚(哈啤啊)。求最少的扫帚数是多少。当时我想挺像拦截系统那个的,但是这题能排序啊。于是我就排序了,浪交一发WA。后来仔细一想还是有点区别的。排好序之后统计一下各个等级的人数,啪,就来了。扫帚数就是最多的人数啊(详细思路见题解)。 之前还做过一个重叠区间的问题:
HDOJ.1050 Moving Tables
这题和1800有异曲同工之妙,大家琢磨琢磨。