da pag. 50 25-MAR-2015 Dir. Resp.: Giorgio Mulè

ASD Lab 8
Alessio Guerrieri
UniTN
5-12-2014
Alessio Guerrieri (UniTN)
ASD Lab 8
5-12-2014
1 / 13
C ALENDARIO (UPDATE)
Mar 9 (14-16): presentazione progetto + lezione Montresor
Mer 10 (11-13): LABORATORIO IN AULA PC (lavoro al progetto)
Ven 12: NESSUNA LEZIONE
Mer 17 (11-13): LABORATORIO IN AULA PC (lavoro al progetto)
Ven 19 (11-13): seconda provetta
Ven 19 (20): scadenza secondo progetto
S ECONDO PROGETTO
Programmazione dinamica, da 1 a 3 punti bonus, assumo stessi
gruppi.
Alessio Guerrieri (UniTN)
ASD Lab 8
5-12-2014
2 / 13
Z AINO
Funzione di ricorrenza (v [i]:valore dell’iesimo elemento, p[i]:peso
dell’iesimo elemento)


− inf



0
(
S(C, i) =

v [i] + S(C − p[i], i + 1)



Max S(C, i + 1)
Alessio Guerrieri (UniTN)
ASD Lab 8
if C < 0
if i == N
if i < N
5-12-2014
3 / 13
Z AINO RICORSIVO
1
2
3
4
5
6
7
8
9
int ric(int c,int i){
if(c<0)
return -100000000;
if(i==N)
return 0;
int p=elements[i].first;
int v=elements[i].second;
return max(v+ric(c-p,i+1),ric(c,i+1));
}
Alessio Guerrieri (UniTN)
ASD Lab 8
5-12-2014
4 / 13
Z AINO MEMOIZATION
1
2
3
4
5
6
7
8
9
10
11
12
int ric(int c,int i){
if(c<0)
return -100000000;
if(i==N)
return 0;
if(sav[c][i]==-1){
int p=elements[i].first;
int v=elements[i].second;
sav[c][i]= max(v+ric(c-p,i+1),ric(c,i+1));
}
return sav[c][i];
}
Alessio Guerrieri (UniTN)
ASD Lab 8
5-12-2014
5 / 13
Z AINO ITERATIVO
Il calcolo di S(c,i) dipende dagli S(c’,i+1).
Calcoliamo prima tutti gli S( ,N-1), poi tutti gli S( ,N-2)...
1
2
3
4
5
6
7
8
9
10
11
for(int i=N-1;i>=0;i--){
int p=elements[i].first;
int v=elements[i].second;
for(int c=0;c<=C;c++){
if(elements[i].first<=c)
sav[c][i]=max(sav[c][i+1],v+sav[c-p][i+1]);
else
sav[c][i]=sav[c][i+1];
}
}
}
Alessio Guerrieri (UniTN)
ASD Lab 8
5-12-2014
6 / 13
Z AINO ITERATIVO EFFICENTE
Una volta calcolati tutti gli S( ,i), gli S( ,i+1) non ci servono piu.
Utilizziamo un array C*2
1
2
3
4
5
6
7
8
9
10
11
for(int i=N-1;i>=0;i--){
int p=elements[i].first;
int v=elements[i].second;
int cur=i%2; int next=(i+1)%2;
for(int c=0;c<=C;c++){
if(elements[i].first<=c)
sav[c][cur]=max(sav[c][next],v+sav[c-p][next]);
else
sav[c][cur]=sav[c][next];
}
}
Alessio Guerrieri (UniTN)
ASD Lab 8
5-12-2014
7 / 13
S OTTOSEQUENZA CRESCENTE
Data una sequenza di interi scegliere un sottoinsieme della sequenza
in modo che:
gli elementi del sottoinsieme, messi nell’ordine in cui si trovavano
nella sequenza originaria, formino una sequenza crescente
il sottoinsieme abbia somma massima
S OTTOPROBLEMA
S(i) = somma della sottosequenza crescente di somma massima a
partire dall’elemento i
NON FUNZIONA! Per scegliere ottimamente, abbiamo bisogno di
sapere l’ultimo elemento scelto
Alessio Guerrieri (UniTN)
ASD Lab 8
5-12-2014
8 / 13
S OTTOSEQUENZA CRESCENTE
S OTTOPROBLEMA
S[i, j]= soluzione per il sottoarray [i..N − 1] avendo scelto per ultimo
l’elemento j


if i == n
0,
S[i, j] = S[i + 1, j],
if A[i] < A[j]


max(S[i + 1, j], S[i + 1, i] + A[i]) if A[i] ≥ A[j]
Alessio Guerrieri (UniTN)
ASD Lab 8
5-12-2014
9 / 13
S OTTOSEQUENZA CRESCENTE
S OTTOPROBLEMA ALTERNATIVO
S[i] =soluzione da i in poi avendo scelto l’elemento i
S[i] = A[i] + maxj:(j>i , A[j]≥A[i]) (S[j])
La soluzione del problema e´ uguale a max(S)
Alessio Guerrieri (UniTN)
ASD Lab 8
5-12-2014
10 / 13
E SPRESSIONE
S OTTOPROBLEMA
S[i, j] = insieme dei valori ottenibili usando il sottoarray A[i...j]
function C OMPUTE S(i,j)
Res = ∅
if i = j then
Res = {A[i]}
else if i + 1 = j then
Res = {A[i] + A[j], A[i] ∗ A[j]}
else
for k = i + 1 to j do
for all l ∈ S[i, k − 1] do
for all r ∈ S[k, S
j] do
Res = Res {l + r , l ∗ r }
end for
end for
end for
end if
return Res
end function
Alessio Guerrieri (UniTN)
ASD Lab 8
O(N 3 × M 2 )
5-12-2014
11 / 13
P ROBLEMI
S OTTOSEQUENZA COMUNE MASSIMALE
Date due stringhe di caratteri alfanumerici, calcolare una
sottosequenza comune massimale (secondo la definizione delle slides
di Montresor). Stamparne la lunghezza
Lettura di una stringa (libreria string):
1
2
string s;
in>>s;
Ottenere dimensione stringa e valore per un singolo carattere
1
2
int dim=s.size();
char c=s[2];
Alessio Guerrieri (UniTN)
ASD Lab 8
5-12-2014
12 / 13
P ROBLEMI
D EFINIZIONE : N ODE -C OVER
Un insieme S ⊆ V di nodi e´ un Node-Cover se ogni arco nel
grafo/albero ha almeno uno dei due nodi in S
M IN C OVER SU ALBERO
Dato un albero, trovare la dimensione del Node-Cover di dimensione
minima.
M IN COVER SU ALBERO PESATO
Dato un albero con pesi su i nodi, trovare il Node-Cover di peso
minimo e stamparne il peso.
Alessio Guerrieri (UniTN)
ASD Lab 8
5-12-2014
13 / 13