貪心選擇是指應用同一規則,將原問題變為一個相似但是規模更小的問題,而后的每一步都是當前看起來最佳的選擇,且這種選擇只依賴于已做出的選擇,不依賴于未作出的選擇。
貪心算法說起來容易,操作起來卻經常有點玄學。(我怎么想的到)
在這里整理一些常見的貪心題目
-
選擇不相交區間問題
這種問題一般具體題目大概就是時間安排,場地安排之類(有一個量不能被重復使用)。解決這種問題的方法為按照對這個量使用的截至時間進行排序,然后進行一次遍歷,如果下一事件開始比這一事件開始遲就將這個事件考慮在內。
證明:如果下一事件的開始比這一事件遲卻沒有考慮,則考慮下下一事件,若開始時間比下一時間結束早,那么將這兩個事件哪個算上都無所謂,若開始時間比下一事件遲,則少考慮了一個,所以上述貪心策略是合理的
注意:在開始和結束的判斷上能否相等需要注意 -
區間選點問題
同樣的對區間按照末尾進行排序(對這種區間問題一般考慮排序,要不然亂糟糟的不可能找到規律)
選擇點的規則為盡量選擇在區間末尾
因為區間與區間相交肯定在前一個區間的末尾相交,所以如果盡量把點放在那里的話就能盡可能讓下一個區間用到。
可以考慮用一個bool型數組表示點,如果選擇就進行標記即可
如果題目要求在區間內標記多個點,那么同樣還是盡量在區間的末尾放點(先在這個區間內看一下是否需要再放,如果需要從后往前放) -
區間覆蓋問題
給定一定的區間,選擇盡量少的區間覆蓋一條指定線段區間
還是得對區間進行排序(不同的在于是對區間的左端點進行排序),依次處理每個區間,每次選擇覆蓋s的區間中右端點最大的一個,并將線段的左端點更新為區間的右端點,直到選擇的區間包含線段的右端點為止。