問題ステートメント-
タスクは、選択した範囲から任意のkテストを削除できるようにして、一連のテストスコアを指定して、最も収益性の高い連続したテストセグメントを見つけることです。 。
問題は最初はDPの問題のように見えますが、テストドロップ条件が明らかになると複雑さが生じます。
この問題に対して、従来のDPアプローチにどのような変更を加えることができますか?それとも、まったく異なるアプローチがありますか?
テスト範囲-N <= 104
出典-INOI2011 Q Paper
さて、ここで私はそれをどのように行うか(あまり詳細には触れずに)
ドロップしたすべての結果の値を追跡します。私はおそらくそれらを、ドロップされたテストの許容数であるソートされたキューに入れます。ゼロに最も近いドロップされたテストが開始時にあるようにソートされます。従来のアルゴリズムを使用してリストをたどっていくと、次のようになります。
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
ある位置で終わる可能な限り最良の範囲は、次の最大値です。
ここで、ドロップされたテストの量が異なる場合に、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
可能な限り最良の範囲の終了は、次の最大値です。