算法学习——贪心篇

 

贪心选择是指应用同一规则,将原问题变为一个相似但是规模更小的问题,而后的每一步都是当前看起来最佳的选择,且这种选择只依赖于已做出的选择,不依赖于未作出的选择。
贪心算法说起来容易,操作起来却经常有点玄学。(我怎么想的到)
在这里整理一些常见的贪心题目

  • 选择不相交区间问题
    这种问题一般具体题目大概就是时间安排,场地安排之类(有一个量不能被重复使用)。解决这种问题的方法为按照对这个量使用的截至时间进行排序,然后进行一次遍历,如果下一事件开始比这一事件开始迟就将这个事件考虑在内。
    证明:如果下一事件的开始比这一事件迟却没有考虑,则考虑下下一事件,若开始时间比下一时间结束早,那么将这两个事件哪个算上都无所谓,若开始时间比下一事件迟,则少考虑了一个,所以上述贪心策略是合理的
    注意:在开始和结束的判断上能否相等需要注意

  • 区间选点问题
    同样的对区间按照末尾进行排序(对这种区间问题一般考虑排序,要不然乱糟糟的不可能找到规律)
    选择点的规则为尽量选择在区间末尾
    因为区间与区间相交肯定在前一个区间的末尾相交,所以如果尽量把点放在那里的话就能尽可能让下一个区间用到。
    可以考虑用一个bool型数组表示点,如果选择就进行标记即可
    如果题目要求在区间内标记多个点,那么同样还是尽量在区间的末尾放点(先在这个区间内看一下是否需要再放,如果需要从后往前放)

  • 区间覆盖问题
    给定一定的区间,选择尽量少的区间覆盖一条指定线段区间
    还是得对区间进行排序(不同的在于是对区间的左端点进行排序),依次处理每个区间,每次选择覆盖s的区间中右端点最大的一个,并将线段的左端点更新为区间的右端点,直到选择的区间包含线段的右端点为止。

 

原文地址:https://www.cnblogs.com/qgmzbry/p/10662106.html