我想解決this problem,其中給出N(N < = 1000)區間,算法應該計算(大小)最大的區間子集,使得沒有三個區間該子集共享一個共同點。現在我只看到一個動態編程算法。最多有2個重疊的區間選擇算法
我的想法是通過結束時間對間隔進行排序,然後考慮以下子問題: A [i] - 僅使用第一個i間隔的問題解決方案(即最大間隔數)。
現在我的問題是關於復發:如果第i間隔被採用,那麼我無法找出復發。
有人可以解釋我做錯了什麼地方(是子問題的定義還是我錯過了重複子問題)?
EDIT(新的想法?) 經過一番研究,我發現這個DP solution爲一般作業選擇算法。因此,下一個想法是獲得q
數組,其中q[i]
=最後一個間隔的索引與第i個間隔不重疊。 然後是肯定的,該公式用於計算A [1]當第i個間隔取會是這樣(注意丟失的部分):
A[i] = 1 + A[q[i]] + [missing-part];
//1 stands for the i-th interval
//A[q[i]] stands for the solution of the intervals that do not overlap with with the i-th interval
//[missing-part] is the maximum number of intervals from the intervals that overlap with the i-th intervals that are safe to be added.
的問題依然存在:如何計算缺失部分?
EDIT(貪婪的解決方案,而不是想要的解決方案) 貪心的解決方案是非常簡單的,非常類似於Job Selection Problem,與其他檢查,添加一個新的區間時,也必須保持不存在未處理的間隔這打破了問題的狀況。
我不確定這個方向是否可以工作,因爲它可能會在添加一個新的時間間隔時,我們不能添加到以前的解決方案,而是必須完全改變事情。 – redtuna
@redtuna我相信只有A [i]還不夠,但是......你有沒有其他想法? –
當然,我會嘗試一個貪婪的啓發式搜索算法。 – redtuna