dynamische Programmierübung zum Schneiden von Saiten

16

Ich habe an dem folgenden Problem aus diesem Buch gearbeitet .

Eine bestimmte Zeichenkettenverarbeitungssprache bietet eine primitive Operation, die eine Zeichenkette in zwei Teile aufteilt. Da bei dieser Operation die ursprüngliche Zeichenfolge kopiert wird, werden für eine Zeichenfolge mit der Länge n unabhängig von der Position des Schnitts n Zeiteinheiten benötigt. Angenommen, Sie möchten eine Zeichenfolge in viele Teile teilen. Die Reihenfolge der Pausen kann sich auf die Gesamtlaufzeit auswirken. Wenn Sie beispielsweise eine Zeichenfolge mit 20 Zeichen an den Positionen und ausschneiden möchten, verursacht der erste Schnitt an Position Gesamtkosten von , während Position 10 zuerst bessere Kosten von .10 3 20 + 17 = 37 20 + 10 = 30310320+17=3720+10=30

Ich brauche einen dynamischen Programmieralgorithmus, der bei Schnitten die minimalen Kosten für das Schneiden eines Strings in Stücke ermittelt.m + 1mm+1

Kennzeichen
quelle

Antworten:

10

Die Grundidee ist: Probieren Sie alle Schnittpositionen als erste Wahl aus, lösen Sie die jeweiligen Teile rekursiv, addieren Sie die Kosten und wählen Sie das Minimum.

In der Formel:

mino(s,C)={|s|,|C|=1|s|+mincC[mino(s1,c,{cCc<c}) + mino(sc+1,|s|,{ccCc>c})], else

Beachten Sie, dass das Anwenden von Memo auf diese Rekursion tatsächlich Arbeit spart, da das Umschalten der Reihenfolge nacheinander angewendeter Schnittpaare dazu führt, dass dieselben drei Teilprobleme gelöst werden.

Raphael
quelle
1

Es ist immer eine gute Idee, zuerst einen rekursiven Algorithmus zu finden und ihn dann in eine Tabelle umzuwandeln.

  1. f(C,n)
  2.    if (C = ) gibt 0 zurück;
  3.    sonst
  4.      opt = unendlich;
  5.     für jedes tuncC
  6.       D={dC:d<c}
  7.       E={e-c:eD,e>c}
  8.       Öpt=michn{Öpt,f(D,c)+f(E,n-c)}
  9.     Öpt+n

(n2)Ef

Dimitar Stratiev
quelle
0

Dies ist Quicksort in einem Multiset sehr ähnlich. Es ist optimal, wenn der Schnittpunkt der Mitte am nächsten liegt.

sk

KWillets
quelle