贪心

234 阅读1分钟

贪心的本质是选择每一阶段的局部最优,从而达到全局最优

什么是贪心

贪心的本质是选择每一阶段的局部最优,从而达到全局最优

什么时候用贪心

  • 自己手动模拟,模拟可行就可以试一试贪心策略,不可行就需要动态规划
  • 举反例,想不到反例,就试一试贪心

说白了就是常识性推导+举反例

解题步骤

  • 划分子问题
  • 找出适合的贪心策略
  • 求解每一个子问题的最优解
  • 将局部最优解堆叠成全局最优解

例题

用最少数量的箭引爆气球

重构字符串

翻转矩阵后的得分

思路

先行翻转,使第一列都为1

再进行列反转,使每一列的1比0多

证明

对于每一行表示的n位二进制数,我们可以证明最高位为1的数恒大于最高位为0的数:

最高位为1的最小n位二进制数是0b10000...00,最高位为0的最大n位数为0b01111...11,前者等于2^(n-1)

后者等于2^(n-1)-1

每一行最高位都为1以后,接下来只需要使每一列1的个数大于0的个数,这样得分就会最大

柠檬水找零

思路

找钱时,优先找大面值的,因为小面值的更常用

Dota2参议院

思路

R让离他最近的D失去权力,D亦然。

这里,「最近」体现了贪心的思想,在实际游戏中,我们的直觉也会告诉我们这样做。