Dynamische Programmierung - Dieb-Variationsproblem
-
29-09-2020 - |
Frage
Ich habe ein dynamisches Programmierproblem begegnet, das eine Variation des Diebs eins ist.
Sagen Sie, Sie sind ein Dieb, und Sie erhalten eine Reihe von Häusern in einer Reihe, die Sie rauben sollten:
$$ house_1, house_2 \ dots house_n $$
Mit jedem Haus mit den folgenden Werten:
Sie profitieren x wenn Sie ein Haus rauben, aber keiner der angrenzenden
Sie profitieren
Sie profitieren z wenn Sie ein Haus rauben und
Fälle mit Häusern A-B-C wäre:
$$ Gewinn (001)= 0 + 0 + c_x $$
wo 1 steht, um das Haus zu rauben und 0, um das Haus nicht auszuberufschen
Natürlich können Sie den
Jetzt ist die Frage: Welche Häuser sollten Sie rauben, um den maximalen Gewinn zu erhalten?
Mein Hauptproblem ist, dass ich keinen Grundfall für dieses Problem aufbauen kann.
Ich dachte zunächst daran, ein
Alle Tipps oder Richtungen würden geschätzt.
Vielen Dank im Voraus.
Lösung
für $ i= 1, \ dots, n $ , und $ r \ in \ {s, r, B \} $
Definieren Sie $ opt [i, r] $ als
Der maximale Gewinn, der erhalten werden kann, indem Sie eine geeignete Teilmenge des ersten
- .
- wenn $ x= s $ (wie in s kip), dann Haus $ i $ darf nicht ausgeraubt werden.
- wenn $ x= r $ dann haus $ i $ muss
r Obbed während Haus $ i + 1 $ wird nicht ausgeraubt (um ein Fall zu vermeiden, dass wir später vorgeben, dieses Haus $ i + 1 $ existiert, auch wenn $ i= n $ ). - wenn $ x= B $ dann
b oth house $ i $ und Haus $ i + 1 $ müssen ausgeraubt werden.
für $ i= 1 $ Sie haben $ opt [1, s]= 0 $ , $ opt [1, r]= x_1 $ , $ opt [1, b]= y_1 $ .
für $ i> 1 $ Sie haben:
Der optimale Gewinn ist dann: $ \ max \ {opt [n, s], opt [n, r] \} $ und kann in berechnet werden $ O (n) $ Gesamtzeit mit den obigen Formeln.