web-dev-qa-db-ja.com

トレーニングキャンプアルゴリズム

問題ステートメント-

Problem Statement

タスクは、選択した範囲から任意のkテストを削除できるようにして、一連のテストスコアを指定して、最も収益性の高い連続したテストセグメントを見つけることです。 。

問題は最初はDPの問題のように見えますが、テストドロップ条件が明らかになると複雑さが生じます。

この問題に対して、従来のDPアプローチにどのような変更を加えることができますか?それとも、まったく異なるアプローチがありますか?

テスト範囲-N <= 104

出典-INOI2011 Q Paper

5
7Aces

さて、ここで私はそれをどのように行うか(あまり詳細には触れずに)

ドロップしたすべての結果の値を追跡します。私はおそらくそれらを、ドロップされたテストの許容数であるソートされたキューに入れます。ゼロに最も近いドロップされたテストが開始時にあるようにソートされます。従来のアルゴリズムを使用してリストをたどっていくと、次のようになります。

if I encounter a negative number
    if the queue is not full
        add it to the queue
    else
        if the new negative number is smaller (farther from zero) than the first number in the queue
            remove the first number from the queue
            add the new number to the queue
            add the removed number to the current subsequence value
        else
            add the new negative number to the current subsequence value

そうすれば、常にシーケンスの最悪のマークなしでサブシーケンスを保持し、さらに最悪のマークに遭遇した場合は、以前にドロップしたマークの値をサブシーケンスの値に復元できます。

元のアルゴリズムは基本的に次のとおりです。

for each position:
    calculate best range ending at this position
print best over all possible ending positions

ある位置で終わる可能な限り最良の範囲は、次の最大値です。

  • 0 (starting from scratch here)
  • 以前の位置+新しいマークの可能な最高の範囲

ここで、ドロップされたテストの量が異なる場合に、Kのエンディングを計算する必要があります

for each position:
    for k = 0 to K:
        calculate best possible range ending at this position and dropping at most k tests
print best of all calculated ranges

可能な限り最良の範囲の終了は、次の最大値です。

  • 0 (starting a new range at this position)
  • 以前の位置+新しいマークの可能な限り最高の範囲
  • 前のポジションの可能な最高の範囲と1つ少ないドロップテスト
1
Winston Ewert