1.2贪心算法
算法理解
每次做决策时总是采取当前最优策略,从局部最优到整体最优
贪心的证明
一般使用反证法,证明这样做是不劣的
贪心的特征
1.贪心选择特征
每次选择可能依赖于以前的选择但不依赖于后面的选择,要证明它,就要证明它满足局部最优到整体最优,好像又证回去了
2.最优子结构性质
一个问题的最优解包含其子问题的最优解
贪心与dp的区别
一般像题目说什么全部都要满足,然后求最小代价这类题目是贪心,T1,T2,T3,若是什么选择一部分,获得最大代价,那么大抵可以往dp,反悔贪心上考虑
T1:
因为最后答案让求的是时间最长的衣服时间最短(这类问题不都是二分),所以我们选择每一分钟只晒湿度最大的衣服(子问题最优解)
ps:写错了,这道题也可以用二分
T2:
我们的目的是覆盖所有的点对,所以必然如果一个点对没有被覆盖就要新开一个雷达,所以最优策略就是要让一个雷达覆盖尽可能多的点对,但是在二维平面上做不到这一点,所以要将它投影到x轴上,也就是在只要雷达在这条线段上就可以覆盖到这个点
T3:
每次小根堆维护每个畜栏最先吃完的奶牛,然后判断这个奶牛是新开一个畜栏还是就用这个畜栏就行了
T4:(TTT___TTT)
卡了好久的一道题,先去恶补了一下哈夫曼树
哈夫曼树
我们定义一棵树的路径长度为从各个叶子节点到根节点的长度乘以该叶子节点的权值的加和,现在我们要构造一棵路径长度最短的树,这就是哈夫曼树
做法
考虑贪心,我们先让所有叶子节点自己为一棵树,每次贪心的堆维护前k个(k为树的叉树)根节点权值最小的树,将它们合并成一棵树,树的根节点就是他的子节点权值之和,最后形成的树就是哈夫曼树
哈夫曼编码
我们要进行一个加密通话,将几个单词转化成k进制然后排列在一起,每个单词有出现的频次,我们需要让加密后总长度最短,并且可以解密(一个单词不可以是另一个的前缀), 我们考虑如果将每一个单词设为一个叶子节点,权值就是它出现的频次,进行一个哈夫曼树,树的路径长度就是最优解
荷马史诗就是哈夫曼编码的版子题
类似模型(汽车加油问题)
结论:这种最小曼哈顿距离,将 a,b 排一下序,然后对位相减最优,这里用邻项交换的放法给出一个理性的证明:
T5:
水题,注意类型转换
T6:
贪心策略,只有最近的树才会决定其相邻的树砍伐高度,正反跑一边即可
T7:
发现字典序很容易出贪心,可能每次取最大值的本质注定它是个贪心吧,因为栈中除了栈顶其余都无法改变顺序,所以对本位最大没有贡献,只需要维护其余最大值就行
T8:
或越或越多,与越与越少,或运算或上所有是最优的,与运算与的最少是最优的,暴力与会超时,手动与运算即可
T9:
靠重点:简单路径为i到j的不重复路径,简单路径上的点包括两个端点!!!
所以要想构成美丽仙人掌,i 到 i+1 必定要连一条边,又因为是仙人掌要选最多的边,所以问题就转化成了 n 条线段,选不重复的线段,选最多条,经典贪心