[学习笔记]贪心
贪心是一个考察智商的算法。
也是一个考察猜结论能力,证明能力的算法。
和DP类似,贪心也有一个前提,问题必须有最优子结构。
一、经典模型:
①硬币问题:找零钱——贪心
②部分背包:性价比排序
③区间问题
给定 n 个区间,每个区间左右端点分别为 li, ri,现在要求选出尽量多的区间使得它们两两不相交 (不包括端点),问最多能选出几个区间:
按照右端点从小到大排序决策。选择右端点最小的,剩余的空间最大。决策具有包容性。
④顺序问题
给定 n 个数 ai,再给出 n 个数 bi,现在要求你重新排列 b 的顺序,
使得$\sum_{i=1}^n ai\times bi$最小
排序不等式,交换法即可证明。
二、贪心的一般证明方法,也可以看做是入手的方法:
1.微扰法(临项交换)
一般用于对于若干个数排序,然后找最优解等等。
例题:
之前模型的④顺序问题。排序不等式的证明。
经典地,NOIP2012国王游戏。
还有叠罗汉的问题:Guard Mark
都是交换即可证明排序的条件。
还有分两段甚至更多段交换的:BZOJ 3709&&AGC 018 C——多段排序的微扰法
还有从国王游戏衍生的:皇后游戏:luoguP2123 皇后游戏——微扰法的应用与排序传递性的证明
皇后游戏其实是微扰法的究极题目了。
它告诉我们,微扰法的另一个适用条件是排序的大小关系具有传递性。
2.范围缩放
3.决策包容性
模型的③区间问题 就是很好的例子。
4.反证法
5.数学归纳法
三、还有一些贪心的常用方法:
1.高位贪心:从高位到低位确定,本质是大小比较的本质:先比较高位,再比较低位。
①字典序问题。
②异或问题:给定 n 个数,求选两个数进行异或操作所能得到的最大值。0/1trie上高位贪心即可。
还有一个经典地高位贪心+dp验证题目:CF981D Bookshelves
2.反悔贪心
(名字是我自己起的)
贪心是不能反悔的。因为它就是选择当前的最优解。
但是如果当前最优解不是全局最优解怎么办?
我们可以设计一种反悔的方法,并且和贪心的手法结合。
使得贪心随便选择,都可以达到正解。
3.树上贪心:
这种贪心往往和子树、儿子的信息联系在一起,有的甚至和树形dp有些类似。但是本质其实是贪心。
其他的贪心:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步