贪心的本质是选择每一阶段的局部最优,从而达到全局最优
什么是贪心
贪心的本质是选择每一阶段的局部最优,从而达到全局最优
什么时候用贪心
- 自己手动模拟,模拟可行就可以试一试贪心策略,不可行就需要动态规划
- 举反例,想不到反例,就试一试贪心
说白了就是常识性推导+举反例
解题步骤
- 划分子问题
- 找出适合的贪心策略
- 求解每一个子问题的最优解
- 将局部最优解堆叠成全局最优解
例题
思路
先行翻转,使第一列都为1
再进行列反转,使每一列的1比0多
证明
对于每一行表示的n位二进制数,我们可以证明最高位为1的数恒大于最高位为0的数:
最高位为1的最小n位二进制数是0b10000...00,最高位为0的最大n位数为0b01111...11,前者等于2^(n-1)
后者等于2^(n-1)-1
每一行最高位都为1以后,接下来只需要使每一列1的个数大于0的个数,这样得分就会最大
思路
找钱时,优先找大面值的,因为小面值的更常用
思路
R让离他最近的D失去权力,D亦然。
这里,「最近」体现了贪心的思想,在实际游戏中,我们的直觉也会告诉我们这样做。