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

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.


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


0

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

sk

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.