一、基本思想
-->归纳、分析、选择正确合适的贪心策略
在每一个局部阶段,都做一个在当前“看上去”最优的决策,并期望通过每一次所做的局部最优选择产生出一个全局最优解。做出贪心决策的依据称为“贪心策略”。贪心策略一旦做出,就不可再更改。
二、3种证明方法(反证法,构造法,调整法)
1、反证法
用贪心的策略,依次构造出一个解 S1,假设最优解 S2 不同于S1,可以证明是矛盾的,从而得出 S1 就是最优解。(举出反例)
eg:n个字符串凑成最大整数
->将 A+B 与 B+A 相比较,如果前者大于后者,则认为 A>B。
2、构造法
根据描述的算法,用贪心的策略依次构造出一个解,可证明一定是合法的解。即用贪心法找可行解。( 举例子 )
eg:取火柴游戏(博弈论)
->转成二进制后,进行异或。为0则先取必败;为1则先取必胜
3、调整法
用贪心的策略,依次构造出一个解 S1。假设最优解 S2 不同于 S1,找出不同之处,在不破坏最优性的前提下,逐步调整 S2,最终使其变为 S1,从而 S1 也是最优解。( 调整a[i]和a[j]进行比较 )
eg:排队接水
->把接水时间少的人尽可能排在前面
三、实时调整类贪心
-->每做一步决策都得重新调整决策
eg:桐桐的新闻系统
->将间隔从小到大排序,输出一个(出队)后将它加上间隔再入队
四、贪心的常见模型
-
货币选择问题
-->化异为同(先选面值大的,再选小的)
-
区间调度问题
-->以结束时间递增排序
-
部分背包问题
-->按照单位价值递减排序
-
区间相关问题
(1)选择不相交区间:
数轴上有 n 个开区间。选择尽量多个区间,使得这些区间两两没有公共点。
-->按照右端点递增排序
(2)区间选点问题:
数轴上有 n 个闭区间。取尽量少的点,使得每个区间内都至少有一个点。
-->按照右端点递增排序&&左端点递减排序
(3)区间覆盖问题:
数轴上有 n 个闭区间,选择尽量少的区间覆盖一条指定线段。
-->按照左端点递增排序