これは私が思ったアルゴリズム的な質問ですが、簡単な解決策は考えられませんでした。最大加重セグメントカバレッジアルゴリズム
問題は、二つの有名な問題マージ触発さ:最小セグメントカバレッジ&ナップザック問題を、そして以下のように説明する:すべてl_i, r_i in [1,M]
n
セグメント[l_i, r_i]
を考える
。 n, M
が知られている。
各セグメントの値はv_i
です。オーバーラップしていないセグメントをいくつでも選択できる場合、最大合計値はいくらですか?私は私の考えは オーバー複雑ですが、今、私の頭の中で解決策は、我々はナップザックを解決するように、動的プログラミングを使用している強い気持ちを持って
(感動はokです)。
- 昇順にソート
- で
r_i
によってセグメントがDP(i) := maximum value we can get using segment [0,i]
を定義し、ここでインデックスはj is the largest index where r_j <= l_i, which can be found using binary search
が、私はこのソリューションはO(N lg N)
のだと思います
DP(i) = max(DP(j) + v[i], DP(i-1))
ステップ1の後にソートされた指標です。今、私の問題は:
- この解決策は正しいですか?
- より簡単で優れたパフォーマンスのソリューションはありますか?
これは、「加重インターバルスケジューリング」と呼ばれます。 –
うわー、おかげで、まさに私が探していたものです...そして確かにそれはかなり古典的です。要するに、O(N lg N)が私が達成できる最高のものであるようです... – shole