[贪心]


贪心算法(又称 贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。


贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。

//笔者认为:绝大多数贪心的题目,找到正确的贪心策略那么就离AC不远了;(关于贪心策略的选择,一般可以通过证明。反证法及其好用,来证明该策略是否为正确的贪心策略)


贪心算法步骤:

1.建立数学模型描述问题

2.将求解的问题分解为若干子问题

3.对子问题求解,由子问题的最优解来得到整体的最优解

注:贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,

省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,

通过每一步贪心选择,可得到问题的一个最优解。虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯


使用条件:

1.贪心选择性质:一个问题的整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。

这就是贪心选择性质。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解

2.最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心法求解的关键所在。

在实际应用中,至于什么问题具有什么样的贪心选择性质是不确定的,需要具体问题具体分析


应用问题:

1."硬币"问题 

一个值w(表示当前拥有总量) n个值(表示价值不同的n种物品) 

问最小用多少个物品能花费完w?

贪心策略:优先使用价值高的物品

2. 区间调度问题

一个值总时间t, n个值(l,r) 表示从l开始至r结束的一件事; 

当一个值的r == 另一个值的l时,不允许同时进行;

当两个(l,r)发生交叉,不允许同时进行。

问t内最多能做几件事?

贪心策略:在可选的事件(也就是与当前已选的事件不重叠的事件)中,每次都选取开始时间最早的事件

3.字典序最小问题

一个给定长度的字符串S,每次操作可以进行两种操作;求最小字典序T

(1)从S头部删除一个字符,添加到T尾部

(2)从S尾部删除一个字符,添加到T尾部

贪心策略:每次贪心时,比较S头尾字符,选择更小的一者放入T尾端

等等


例题:

POJ 3253 Fence Repair