這是一個動態的程序問題的解決方案 - 我不知道這是否是你的,因爲我不知道的,你所寫的內容細節,但它可能是。
排序組數字和繪製與x軸給出以排序的順序和y軸給出數目的數目的偏移的曲線。曲線下方會有一些區域。
您的點數有限,通常比該集的成員數少。您可以使用這些點中的每一個來標記集合中的一個點,從而標出曲線上的一個點。
在曲線下繪製直方圖。在每個標記點處,從該點開始的一條線向右,因此線完全位於曲線下方。每條這樣的線都會延伸到達到下一個標記點的x值,此時會有一條線上升到新的標記點。
面臨的挑戰是,然後選擇指向標誌下方的橫線從標記點右側要最大化的區域。這是直接的動態編程。如果您最多可以選擇k個標記點,那麼在直方圖的每個點上可以使用0,1,2,... k標記點(可能包括該點)計算出該點左側可以覆蓋的最多區域。你可以通過參考你已經爲左邊的點求出的答案來找出每個點的答案。最重要的問題的答案是整個問題的答案。
要展開這樣的:假設你正在爲期末最大區域制定出最佳的解決方案,以抵消10.對於每個值j 0..k考慮採取在0,1,2,3結束之前的最佳解決方案..並且保持那個點的高度,而不需要引入新的路線。這個區域的總面積是直到那一點的面積加上他們在那個點上的任何高度乘以到該點的距離所獲得的新區域。同樣考慮這樣做,但是在這一點上使用額外的標記點,所以總面積是j-1點最高達到最佳值的最佳解決方案的面積。點7加上從點10到點7的高度的距離。通過考慮這兩種可能性,可以使用0,1,2,... k標記點在點10處求出最佳解。
我認爲這些問題是相關的,因爲對於每個點,標記與否,它對直方圖貢獻的面積取決於它上面的線的高度,它是最大標記點的高度,不大於點我們目前正在考慮。
要做到這一點,你需要通過給每個點使用至多爲k的最佳解決方案所覆蓋的區域KN元素的數組標記點達到那裏。使用這種大小的額外數組來記錄導致這種最佳解決方案的決策也很方便,因此您可以追溯回答。這有一個大約kn^2的成本,因爲在每個n點你需要計算k值,並回顧以前的所有點。我懷疑你可以通過改變你在每個點存儲的定義來減少它,使其像O(kn)一樣,所以你永遠不必回顧以前的一點。如果你能做到這一點,你可以通過只存儲幾個中間點並在較小的部分再次解決問題來追溯,從而節省商店的時間,但是你需要拼命地缺乏存儲來實現值得一提。
這絕對看起來像是同樣的問題,謝謝!這個視覺解釋非常酷。我有一個關於解決方案的問題。我們需要一個nk元素表還是隻包含n個元素的數組? 「最右點」似乎暗示了一個數組。 – ManOfNetworks 2014-12-04 22:25:38
另外,您是否有解決方案的其他細節?我仍然在努力爲此考慮重現關係。我無法弄清楚一個點左側的區域如何可以用來計算下一個點的面積。 – ManOfNetworks 2014-12-05 04:35:26
我已經擴展了我的答案,嘗試在此添加更多細節。 – mcdowella 2014-12-05 06:24:35