Salta al contenuto
Note per Studenti Esercizio - domande di prima parte su programmazione dinamica (simulazioni d'esame)

Esercizio - domande di prima parte su programmazione dinamica (simulazioni d'esame)

Esame
In questa pagina 3

Fonte: prima parte delle simulazioni d'esame di Algoritmi per l'Ingegneria, Ing. Informatica UniPD (2023-24 e 2025-26). Le due simulazioni hanno la stessa prima parte: dieci domande a risposta unica o a scelta multipla, in cui non si riporta il procedimento ma solo la risposta. Due riguardano la programmazione dinamica, una sulla LCS e una sulla Matrix Chain Multiplication. Qui sono svolte per esteso, con il metodo veloce da usare nel compito e la verifica con l'algoritmo. Le altre otto domande sono raccolte con gli argomenti di cui trattano.

Domanda 1: LCS dei prefissi

Testo. Siano X=⟨a,f,r,a⟩X = \langle a, f, r, a \rangle e Y=⟨a,f,a⟩Y = \langle a, f, a \rangle. Per 0≤i≤40 \le i \le 4 e 0≤j≤30 \le j \le 3, si denoti con l(i,j)l(i, j) la lunghezza di una LCS dei prefissi XiX_i e YjY_j. Determinare l(2,2)+l(4,3)l(2, 2) + l(4, 3).

Risposta: 55.

Metodo veloce

Si traducono l(2,2)l(2, 2) e l(4,3)l(4, 3) nelle coppie di prefissi e si ragiona direttamente (Longest Common Subsequence - ricorrenza, tabella e ricostruzionela LCS di X (m caratteri) e Y (n caratteri) è la sottosequenza comune più lunga. Sottoistanze = coppie di prefissi (Theta(mn)). Ricorrenza: l(i,j) = 0 se i = 0 o j = 0; 1 + l(i-1,j-1) se x_i = y_j; max{l(i-1,j), l(i,j-1)} altrimenti. Bottom-up con tabelle l e b (freccia): mn confronti; ricostruzione in O(m+n). Il D&C sulla stessa ricorrenza costa C(m+n,m) - 1 nodi interni nel caso peggiore (esponenziale). Memoizzazione: stessa complessità nel caso peggiore, ma molto meno lavoro su stringhe simili. Spazio ridotto a Theta(min{m,n}) se serve solo la lunghezza.Longest Common Subsequence - ricorrenza, tabella e ricostruzione →):

  • X2=⟨a,f⟩X_2 = \langle a, f \rangle e Y2=⟨a,f⟩Y_2 = \langle a, f \rangle sono uguali, quindi l(2,2)=∣LCS(⟨a,f⟩,⟨a,f⟩)∣=2l(2, 2) = |\text{LCS}(\langle a, f \rangle, \langle a, f \rangle)| = 2;
  • X4=⟨a,f,r,a⟩X_4 = \langle a, f, r, a \rangle e Y3=⟨a,f,a⟩Y_3 = \langle a, f, a \rangle: Y3Y_3 è una sottosequenza di X4X_4 (si cancella la rr), quindi la LCS è Y3Y_3 stessa e l(4,3)=3l(4, 3) = 3 (non può superare ∣Y3∣=3|Y_3| = 3).

Somma: l(2,2)+l(4,3)=2+3=5l(2, 2) + l(4, 3) = 2 + 3 = 5.

Regola utile: se una delle due stringhe è sottosequenza dell'altra, la LCS è la più corta e la sua lunghezza è min⁡{i,j}\min\{i, j\}.

Con l'algoritmo

Si riempie la tabella con la ricorrenza l(i,j)=1+l(i−1,j−1)l(i, j) = 1 + l(i-1, j-1) se xi=yjx_i = y_j, altrimenti max⁡{l(i−1,j),l(i,j−1)}\max\{l(i-1, j), l(i, j-1)\}, con riga 00 e colonna 00 a zero.

ε\varepsilon a f a
ε\varepsilon 0 0 0 0
a 0 1↖ 1← 1↖
f 0 1↑ 2↖ 2←
r 0 1↑ 2↑ 2↑
a 0 1↖ 2↑ 3↖

Le celle in grassetto sono l(2,2)=2l(2, 2) = 2 e l(4,3)=3l(4, 3) = 3: 2+3=52 + 3 = 5. Per esempio l(2,2)l(2, 2): x2=f=y2x_2 = f = y_2, quindi 1+l(1,1)=1+1=21 + l(1, 1) = 1 + 1 = 2. E l(4,3)l(4, 3): x4=a=y3x_4 = a = y_3, quindi 1+l(3,2)=1+2=31 + l(3, 2) = 1 + 2 = 3. La ricostruzione dà ⟨a,f,a⟩\langle a, f, a \rangle. Tabella controllata con Python.

Domanda 2: costo della parentesizzazione ottima

Testo. Sia p=(1,9,10,4)p = (1, 9, 10, 4) il vettore delle dimensioni di una catena di 33 matrici rettangolari. Si calcoli il numero di moltiplicazioni tra scalari nella parentesizzazione ottima.

Risposta: 130130.

Metodo veloce

Le matrici sono A1∈1×9A_1 \in 1 \times 9, A2∈9×10A_2 \in 9 \times 10, A3∈10×4A_3 \in 10 \times 4 (AiA_i ha dimensioni pi−1×pip_{i-1} \times p_i). Con tre matrici ci sono solo due parentesizzazioni: basta confrontarle, ricordando che un prodotto (a×b)(b×c)(a \times b)(b \times c) costa a⋅b⋅ca \cdot b \cdot c (Matrix Chain Multiplication - parentesizzazione ottimadato il vettore p delle dimensioni di una catena di n matrici compatibili (A_i è p_(i-1) x p_i), si cerca la parentesizzazione che minimizza il numero di prodotti tra scalari. Le parentesizzazioni sono numeri di Catalan (esponenziali). Sottostruttura: i due sottoalberi dell'ultimo prodotto sono ottimi (cut-and-paste). Ricorrenza c(i,j) = min su k di c(i,k) + c(k+1,j) + p_(i-1) p_k p_j, c(i,i) = 0. D&C: 3^(n-1) - 1 operazioni. Bottom-up per diagonali crescenti con tabelle m e s: (n^3 - n)/3 prodotti, Theta(n^3). La memoizzazione ha lo stesso costo e non risparmia mai.Matrix Chain Multiplication - parentesizzazione ottima →).

  • ((A1A2)A3)((A_1 A_2) A_3): A1A2A_1 A_2 costa 1⋅9⋅10=901 \cdot 9 \cdot 10 = 90 e dà una matrice 1×101 \times 10; poi (A1A2)A3(A_1 A_2) A_3 costa 1⋅10⋅4=401 \cdot 10 \cdot 4 = 40. Totale 90+40=13090 + 40 = 130.
  • (A1(A2A3))(A_1 (A_2 A_3)): A2A3A_2 A_3 costa 9⋅10⋅4=3609 \cdot 10 \cdot 4 = 360 e dà una matrice 9×49 \times 4; poi A1(A2A3)A_1 (A_2 A_3) costa 1⋅9⋅4=361 \cdot 9 \cdot 4 = 36. Totale 360+36=396360 + 36 = 396.

Il minimo è 130130, con ((A1A2)A3)((A_1 A_2) A_3).

Con l'algoritmo

m[i,i]=0m[i, i] = 0; per le sottocatene di lunghezza 22: m[1,2]=p0p1p2=1⋅9⋅10=90m[1, 2] = p_0 p_1 p_2 = 1 \cdot 9 \cdot 10 = 90 e m[2,3]=p1p2p3=9⋅10⋅4=360m[2, 3] = p_1 p_2 p_3 = 9 \cdot 10 \cdot 4 = 360. Per m[1,3]m[1, 3] si provano i due kk:

  • k=1k = 1: m[1,1]+m[2,3]+p0p1p3=0+360+1⋅9⋅4=396m[1,1] + m[2,3] + p_0 p_1 p_3 = 0 + 360 + 1 \cdot 9 \cdot 4 = 396;
  • k=2k = 2: m[1,2]+m[3,3]+p0p2p3=90+0+1⋅10⋅4=130m[1,2] + m[3,3] + p_0 p_2 p_3 = 90 + 0 + 1 \cdot 10 \cdot 4 = 130.

Quindi m[1,3]=130m[1, 3] = 130 con s[1,3]=2s[1, 3] = 2, cioè ((A1A2)A3)((A_1 A_2) A_3).

Varianti per esercitarsi

Stesso formato della prima parte (solo risposta). Le risposte sono state ottenute con l'algoritmo in Python e controllate a mano.

  1. X=⟨m,a,r,e⟩X = \langle m, a, r, e \rangle e Y=⟨a,m,o,r,e⟩Y = \langle a, m, o, r, e \rangle. Determinare l(2,2)+l(4,5)l(2, 2) + l(4, 5). Risposta: 44. l(2,2)=∣LCS(⟨m,a⟩,⟨a,m⟩)∣=1l(2,2) = |\text{LCS}(\langle m, a \rangle, \langle a, m \rangle)| = 1 (una sola delle due lettere si può tenere, nell'ordine), l(4,5)l(4,5): XX è lunga 44 e ⟨m,r,e⟩\langle m, r, e \rangle (o ⟨a,r,e⟩\langle a, r, e \rangle) è sottosequenza comune di lunghezza 33, e non esiste di lunghezza 44 perché XX intera non è sottosequenza di YY (mm viene dopo aa in YY): l(4,5)=3l(4,5) = 3. Somma 1+3=41 + 3 = 4.
  2. X=⟨p,a,s,t,a⟩X = \langle p, a, s, t, a \rangle e Y=⟨t,a,s,t,o⟩Y = \langle t, a, s, t, o \rangle. Determinare l(3,3)+l(5,5)l(3, 3) + l(5, 5). Risposta: 55. l(3,3)=∣LCS(⟨p,a,s⟩,⟨t,a,s⟩)∣=∣⟨a,s⟩∣=2l(3,3) = |\text{LCS}(\langle p,a,s \rangle, \langle t,a,s \rangle)| = |\langle a, s \rangle| = 2; l(5,5)=∣⟨a,s,t⟩∣=3l(5,5) = |\langle a, s, t \rangle| = 3.
  3. p=(2,5,3,4)p = (2, 5, 3, 4), catena di 33 matrici. Costo della parentesizzazione ottima? Risposta: 5454. ((A1A2)A3)((A_1 A_2) A_3): 2⋅5⋅3+2⋅3⋅4=30+24=542 \cdot 5 \cdot 3 + 2 \cdot 3 \cdot 4 = 30 + 24 = 54; (A1(A2A3))(A_1 (A_2 A_3)): 5⋅3⋅4+2⋅5⋅4=60+40=1005 \cdot 3 \cdot 4 + 2 \cdot 5 \cdot 4 = 60 + 40 = 100.
  4. p=(5,2,6,3,4)p = (5, 2, 6, 3, 4), catena di 44 matrici. Costo ottimo e parentesizzazione? Risposta: 100100, con (A1((A2A3)A4))(A_1 ((A_2 A_3) A_4)): A2A3A_2 A_3 costa 2⋅6⋅3=362 \cdot 6 \cdot 3 = 36; (A2A3)A4(A_2 A_3) A_4 costa 2⋅3⋅4=242 \cdot 3 \cdot 4 = 24; A1×(… )A_1 \times (\dots) costa 5⋅2⋅4=405 \cdot 2 \cdot 4 = 40; totale 36+24+40=10036 + 24 + 40 = 100. La tabella mm ha m[1,2]=60m[1,2] = 60, m[2,3]=36m[2,3] = 36, m[3,4]=72m[3,4] = 72, m[1,3]=66m[1,3] = 66, m[2,4]=60m[2,4] = 60, m[1,4]=100m[1,4] = 100.
  5. Quante parentesizzazioni distinte ha una catena di 66 matrici? Quanti prodotti tra scalari esegue MCM (con costo due per ogni kk, vedi la nota) su 66 matrici? Risposta: 4242 (numero di Catalan); n3−n3=216−63=70\frac{n^3 - n}{3} = \frac{216 - 6}{3} = 70.

Versione ripasso

Testo. Le due simulazioni (2023-24 e 2025-26) hanno la stessa prima parte, a sola risposta. Due domande sono di DP: (1) X=⟨a,f,r,a⟩X = \langle a, f, r, a \rangle, Y=⟨a,f,a⟩Y = \langle a, f, a \rangle, l(i,j)=∣LCS(Xi,Yj)∣l(i,j) = |\text{LCS}(X_i, Y_j)|, calcolare l(2,2)+l(4,3)l(2,2) + l(4,3); (2) p=(1,9,10,4)p = (1, 9, 10, 4), catena di 33 matrici, numero di moltiplicazioni tra scalari della parentesizzazione ottima.

ε\varepsilon a f a
ε\varepsilon 0 0 0 0
a 0 1↖ 1← 1↖
f 0 1↑ 2↖ 2←
r 0 1↑ 2↑ 2↑
a 0 1↖ 2↑ 3↖

Celle in grassetto: l(2,2)=2l(2,2) = 2, l(4,3)=3l(4,3) = 3; somma 55.

Teoria collegata