Sie sind auf Seite 1von 3

Lösungen für Hausaufgaben Acht CSE 101

1. Lehrbuchproblem 6.1.
Unterproblem: Sei S(j) die Summe der zusammenhängenden Maximalsummen-Teilsequenz, die genau auf aj endet (aber
möglicherweise die Länge Null hat). Wir wollen maxj S(j).
Rekursive Formulierung: Die Teilsequenz, die S(j) definiert, hat entweder (i) die Länge Null oder (ii) besteht aus der besten
Teilsequenz, die mit einemj-1 endet, gefolgt von Element aj. Daher

S(j) = max{0, aj + S(j - 1)}.

Für Konsistenz S(0) = 0.


Algorithmus:

S[0] = 0
für j = 1 bis n:
S[j] = max(0, aj + S[j - 1])
return maxj S[j]

Laufzeit: Einzelschleife: O(n).

2. Lehrbuchproblem 6.2.
Teilproblem: T (j) sei die Mindeststrafe, die bis zum Ort aj verhängt wurde, vorausgesetzt, Sie halten dort an. Wir wollen T
(n).
Rekursive Formulierung: Angenommen, wir hören bei einemj auf. Der vorherige Halt ist ein ai, i < j (oder vielleicht ist einj der
erste Halt). Versuchen wir alle Möglichkeiten für ein : i

T(j) = min T(i) + (200 - (aj - a )) ,


i
2

0≤i<j

wobei wir der Einfachheit halber T (0) = 0 und a = 0 setzen.0

Algorithmus:

für j = 1 bis n:
T(j)=(200-aj)2

für i = 1 bis j - 1:
T(j)=min{T(j),T(i)+(200-(aj-ai)) } 2

return T(n)

Laufzeit: Zwei Schleifen, O(n ). 2

3. Lehrbuchproblem 6.7.
Teilproblem: Definieren Sie T (i, j) als die Länge der längsten palindromischen Teilfolge von x[i . . . j]. Wir wollen T(1, n).
Rekursive Formulierung: Bei der Berechnung von T (i, j) lautet die erste Frage, ob x[i] = x[j]. Wenn ja, können wir sie
zuordnen und dann nach innen wiederkehren, zu T (i +1, j-1). Wenn nicht, dann ist mindestens einer von ihnen nicht im
Palindrom.

(1 if i = j
T(i,j) = 2 + T(i + 1,j - 1) wenn i < j und x[i] = x[j]
[ max{T (i + 1,j),T (i,j — 1)} sonst

Für Konsistenz setze T (i, i - 1) = 0 für alle i.


Algorithmus: Berechnen Sie das T(i, j) in der Reihenfolge der zunehmenden Intervalllänge |j - i|.

1
für i = 2 bis n + 1:
T[i, i - 1] = 0 für i = 1 bis n:
T[i,i]=1
für d = 1 bis n - 1: (Intervalllänge)
für i = 1 bis n - d:
j=i+d
wenn x[i] = x[j]:
T[i,j]=2+T[i+1,j-1]
else:
T[i,j] =max{T[i+1,j],T[i,j-1]} Rückgabe T[1, n]

Laufzeit: Es gibt O(n ) Subprobleme und jedes benötigt O(1) Zeit zur Berechnung, so dass die Gesamtlaufzeit O(n ) ist.
2 2

4. Lehrbuchproblem 6.17.
Teilproblem: Definieren Sie für jede ganze Zahl 0 ≤ u ≤ v T (u) als wahr, wenn es möglich ist, mit den gegebenen Münzen x 1,
x 2,..., xn eine Änderung für u vorzunehmen. Die Antwort, die wir wollen, ist T (v).
Rekursive Formulierung: Beachten Sie, dass

T (u) ist genau dann wahr, wenn T (u - x ) für einige i wahr ist.
i

Für Konsistenz setzen Sie T (0) auf true.


Algorithmus:

T [0] = wahr
für u = 1 bis v:
T [u] = false
für i = 1 bis n:
wenn u ≥ x und T [u - x ]: T [u] = true
i i

Laufzeit: Die Tabelle hat die Größe v und jeder Eintrag benötigt O(n) Zeit zum Ausfüllen; daher beträgt die Gesamtlaufzeit
O(nv).

5. Anzahl der Pfade in einer DAG.


Subproblem: Angenommen, G ist ein gerichteter azyklischer Graph. Definieren Sie für jeden Knoten v im Graphen
numpaths[v] als die Anzahl der Pfade von s bis v. Die gewünschte Menge ist numpaths[t].
Rekursive Formulierung: Pick (u, jeder Knoten v 6= s im Diagramm. Jeder Pfad von s bis v endet in einer Kante
v ) ∈ E. Somit gilt:
numpaths[v] = numpaths[u].
u:(u,v)∈E

Und natürlich numpaths [s] = 1.


Algorithmus: Wir können das Array ausfüllen, indem wir die Knoten in topologischer Reihenfolge betrachten:

Finde eine topologische Ordnung von G für alle v ∈ V :


numpaths[v] = 0
numpaths[s] = 1
für alle u ∈ V in topologischer Reihenfolge:
für alle (u, v) ∈ E :
numpaths[v] = numpaths[v] + numpaths[u] Rückgabe numpaths[t]

Laufzeit: Die Gesamtlaufzeit ist O(V + E), linear.

6. Lehrbuchproblem 6.21.
Subproblem: Verwurzeln Sie den Baum an einem beliebigen Knoten r. Definieren Sie für jedes u ∈ V

T(u) = Größe der kleinsten Scheitelbedeckung des Teilbaums, der bei u verwurzelt ist.

Wir wollen T (r).


Rekursive Formulierung: Bei der Ermittlung von T (u) ist die unmittelbarste Frage, ob u in der Scheitelpunktabdeckung ist.
Wenn nicht, dann müssen sich seine Kinder in der Vertex-Abdeckung befinden. Lass C(u) die Menge der Kinder von u sein,
2
und lass G(u) seine Enkelkinder sein. Dann

T(u) = min
।)
T(u)=min
|C(u)|+Pz∈G(u)T(z)

wobei |C (u)| die Anzahl der Kinder des Knotens u ist. Der erste Fall umfasst u in der Scheitelpunktabdeckung; der zweite Fall
nicht.
Algorithmus:

Wählen Sie einen beliebigen Wurzelknoten r


dist[·] = BfS(Baum, r)

für alle Knoten u, in der Reihenfolge abnehmender Dist:


51 = 1 (Option 1: u in die Scheitelabdeckung aufnehmen)
für alle (u, w) ∈ E so, dass dist[w] = dist[u] + 1: (d.h. w = Kind von u):
S1 = S1 + T [w]
52 = 0 (Option 2: u nicht in die Scheitelpunktabdeckung aufnehmen)
für alle (u, w) ∈ E so, dass dist[w] = dist[u] + 1: (d.h. w = Kind von u):
S2 = S 2 + 1
für alle (w, z) ∈ E so, dass dist[z] = dist[w] + 1: (d.h. z = Enkel von u):
S2 = S2 + T [z]
T[u] = min{S1,S2}
return T [r]

Laufzeit: Die an jedem Knoten geleistete Arbeit ist proportional zur Anzahl der Enkelkinder, |G(u)|. Seit u |G(u)| ≤ |V | (jeder
Knoten hat höchstens ein Großelternteil), die geleistete Gesamtarbeit ist linear.

7. Lehrbuchproblem 6.19.
Teilproblem: Definieren Sie für beliebige ganze Zahlen 0 ≤ u ≤ v und 0 ≤ j ≤ k T (u, j) als wahr, wenn es möglich ist, eine
Änderung für u unter Verwendung von höchstens j Münzen mit Nennwerten, die aus x 1, x2, ..., xn ausgewählt sind,
vorzunehmen. Die Antwort, die wir wollen, ist T (v, k).
Rekursive Formulierung: Beachten Sie, dass

T(u, j) ist genau dann wahr, wenn (entweder u = 0 oder (T(u - xi,j - 1) ist für einige i wahr)).

Für Konsistenz setzen Sie T (0, j) auf true für alle j und T (u, 0) auf false für u > 0.
Algorithmus:

für j = 0 bis k:
T [0, j] = wahr
für u = 1 bis v:
T [u, 0] = false
für j = 1 bis k:
für u = 1 bis v:
T [u, j] = false
für i = 1 bis n:
wenn u ≥ xi und T [u - xi, j - 1]: T [u, j] = wahr
return T [v, k]

Laufzeit: Die Tabelle hat die Größe k × v und jeder Eintrag benötigt O(n) Zeit zum Ausfüllen; daher beträgt die Gesamtlaufzeit
O (nkv).

Das könnte Ihnen auch gefallen