java programare dinamica
TRANSCRIPT
-
7/25/2019 Java Programare Dinamica
1/153
-
7/25/2019 Java Programare Dinamica
2/153
-
7/25/2019 Java Programare Dinamica
3/153
Se consider vectorul w = w
1
,..., w
n
).
S se determine un
subvector
al lui w care nu conine
elemente consecutive
n w i are suma elementelor
maxim
Exemplu
Pentru
w = 1, 4, 7, 5)
soluia este
4, 5)
-
7/25/2019 Java Programare Dinamica
4/153
Problem echivalent
Se consider un graf de tip lan cu V =
{v
1
,..., v
n
}.
V
rfurile
grafului au asociate ponderile w
1
,..., respectiv w
n
.
S se determine o mulime independent de vrfuri de
pondere maxim
ponderea unei mulimi de vrfuri = suma ponderilor vrfurilor
1 4 7 5
-
7/25/2019 Java Programare Dinamica
5/153
Aplicaii probleme de alocare de resurse cu evitarea
interferenei (indicat prin muchii -> graf de conflicte)Ponderea asociat vrfurilor poate reprezenta cantitatea dedate pe care staia trebuie s o transmit
Problem transmiterea cantitii maxime de date fr
interferene
Nu se cunosc algoritmi polinomiali n cazul general
(NP-completitudine)
Maximum Weighted Independent Set
-
7/25/2019 Java Programare Dinamica
6/153
Abordare cu metoda Greedy
La un pas este adugat n soluie vrful de ponderemaxim neadiacent cu cele deja selectate
Soluia
: {v3, v1} cu ponderile {7, 1} nu este optim
1 4 7 5
-
7/25/2019 Java Programare Dinamica
7/153
Abordare cu metoda Divide et Impera
Incorectreuniunea soluiilor subproblemelor nu este o
soluie posibil (corect) pentru problema iniial
1 4 7 5
4 7
-
7/25/2019 Java Programare Dinamica
8/153
Cutarea exhaustiv a soluiei optime
Generarea tuturor soluiilor posibile i determinarea celeioptime algoritm exponenial
-
7/25/2019 Java Programare Dinamica
9/153
Problema nu se poate rezolva folosind metode
deja studiate
-
7/25/2019 Java Programare Dinamica
10/153
Analizm structura unei soluii optime, evideniind
un element (primul/ultimul) al acesteia, pentru a
determina subprobleme utile i relaii de recuren
-
7/25/2019 Java Programare Dinamica
11/153
Fie S V = {v1,..., vn} o soluie optim
Dac vnS S-{vn} este soluie optim pentru
G-{vn, vn-1}
Dac vnS S este soluie optim pentru
G-{vn}
-
7/25/2019 Java Programare Dinamica
12/153
Fie S V = {v1,..., vn} o soluie optim
Dac vnS S-{vn} este soluie optim pentru
G-{vn, vn-1}
Dac vnS S este soluie optim pentru
G-{vn}
-
7/25/2019 Java Programare Dinamica
13/153
Fie S V = {v1,..., vn} o soluie optim
Dac vnS S-{vn} este soluie optim pentru
G-{vn, vn-1}
Dac vnS S este soluie optim pentru
G-{vn}
Dac am tii deja soluiile pentru grafurile G-{vn
, v
n-1
} i
G-{v
n
}
, am putea determina S alegnd dintre cele dou
situaii cazul n care se obine soluia optim
-
7/25/2019 Java Programare Dinamica
14/153
Recuren:
Notm S(i) = ponderea maxim a unei mulimi
independeten graful indus de vrfurile {v1,..., vi}
S n) = max{ S n-2)+wn
, S n-1)}
S 1) = w1
, S 0) = 0
-
7/25/2019 Java Programare Dinamica
15/153
S(n)
S(n-1) S(n-2)
S(n-2) S(n-3) S(n-3) S(n-4)
S(n-3) S(n-4)
Subproblemele se repet algoritm exponenial
-
7/25/2019 Java Programare Dinamica
16/153
S(n)
S(n-1) S(n-2)
S(n-2) S(n-3) S(n-3) S(n-4)
S(n-3) S(n-4)
Putem evita rezolvarea unei subprobleme de mai
multe ori?
-
7/25/2019 Java Programare Dinamica
17/153
Recuren:
S n)= max{ S n-2)+w
n
, S n-1)}
Memorm ntr-un vector rezultatele subproblemelor
deja rezolvate memoizare)
o subproblem va fi
rezolvat o singur dat algoritm O(n)
-
7/25/2019 Java Programare Dinamica
18/153
S(0) S(1)
S(2)
S(3)
S(4)
-
7/25/2019 Java Programare Dinamica
19/153
Mai eficientimplementare iterativ a recurenei
(bottom-up)
-
7/25/2019 Java Programare Dinamica
20/153
-
7/25/2019 Java Programare Dinamica
21/153
int Sol(int n){
if(n==0) return 0;
if(n==1) return w[1];
if (s[n]==0) //nerezolvata
s[n]= Math.max(Sol(n-2)+w[n],Sol(n-1));
return s[n];
}]; poz = i;}
for(int i=0;i
-
7/25/2019 Java Programare Dinamica
22/153
-
7/25/2019 Java Programare Dinamica
23/153
int SolNerec(int n){
s[0] = 0;
s[1] = w[1];
for(int i=2;i
-
7/25/2019 Java Programare Dinamica
24/153
Cum putem determina i o submulime optim, nu
doar ponderea?
-
7/25/2019 Java Programare Dinamica
25/153
Cum putem determina i o submulime optim, nu
doar ponderea?
Din relaia de recuren putem deduce ce vrfuri au
fost selectate n soluie
s[n]= max{ s[n-2]+w[n], s[n-1]}
Dac s[n] = s[n-2]+w[n] , vrfuln se adaug n
soluie i problema se reduce la primele n-2 vrfuri
Dac s[n] = s[n-1], nu se adaug nici un vrf lasoluie i problema se reduce la primele n-1 vrfuri
-
7/25/2019 Java Programare Dinamica
26/153
Cum putem determina i o submulime optim, nu
doar ponderea?
Din relaia de recuren putem deduce ce vrfuri au
fost selectate n soluie
s[n]= max{ s[n-2]+w[n], s[n-1]}
Dac s[n] = s[n-2]+w[n] , vrfuln se adaug n
soluie i problema se reduce la primele n-2 vrfuri
Dac s[n] = s[n-1], nu se adaug nici un vrf lasoluie i problema se reduce la primele n-1 vrfuri
-
7/25/2019 Java Programare Dinamica
27/153
static void SolNerecCuAfis(int n){
int i;
s[0]=0; s[1]=w[1];
for(i=2;i1){
if(s[i]==s[i-2]+w[i]){
System.out.println(i+" de pondere "+w[i]);
i=i-2;
}
else
i=i-1;
}
if(i==1)
System.out.println(i+" de pondere "+w[i]);
}
-
7/25/2019 Java Programare Dinamica
28/153
static void SolNerecCuAfis(int n){
int i;
s[0]=0; s[1]=w[1];
for(i=2;i1){
if(s[i]==s[i-2]+w[i]){
System.out.println(i+" de pondere "+w[i]);
i=i-2;
}
else
i=i-1;
}
if(i==1)
System.out.println(i+" de pondere "+w[i]);
}
-
7/25/2019 Java Programare Dinamica
29/153
static void SolNerecCuAfis(int n){
int i;
s[0]=0; s[1]=w[1];
for(i=2;i1){
if(s[i]==s[i-2]+w[i]){
System.out.println(i+" de pondere "+w[i]);
i=i-2;
}
else
i=i-1;
}
if(i==1)
System.out.println(i+" de pondere "+w[i]);
}
-
7/25/2019 Java Programare Dinamica
30/153
-
7/25/2019 Java Programare Dinamica
31/153
Greedy nu furnizeaz mereu soluia optim
Alte exemple:
Problema rucsacului, cazul discret
Problema monedelor, cazul general
-
7/25/2019 Java Programare Dinamica
32/153
Divide et Impera ineficient dac subproblemele se
repet
-
7/25/2019 Java Programare Dinamica
33/153
Exemplu - CalculmnumrulFibonacci F(n)F(n) = F(n-1)+F(n-2)
F(0) = F(1) = 1
F(4)F(4)
F(3) F(2)
F(2) F(1) F(1) F(0)
F(1) F(0)
-
7/25/2019 Java Programare Dinamica
34/153
Exemplu CalculmnumrulFibonacci F(n)F(n) = F(n-1)+F(n-2)
F(0) = F(1) = 1
F(4)F(4)
F(3) F(2)
F(2) F(1) F(1) F(0)
F(1) F(0)
-
7/25/2019 Java Programare Dinamica
35/153
Soluii
reducere la subprobleme utile + relaii de recuren
rezolvarea eficient a subproblemelor
recursiv cu memoizare (salvarea rezultatelor subproblemelor
deja rezolvate)
algoritmi iterativi buttom-up
Metoda programrii dinamice
-
7/25/2019 Java Programare Dinamica
36/153
-
7/25/2019 Java Programare Dinamica
37/153
Probleme care presupun rezolvarea de relaii derecuren
De obicei aceste relaii se obin din respectarea unuiprincipiu de optimalitate (subprobleme optime)
-
7/25/2019 Java Programare Dinamica
38/153
Fie A i B dou mulimi oarecare (B = N, Z, R, {0,1} )
Fiecrui xA urmeaz s i se asociezeo valoare v(x)B.
x
A v x)
B
-
7/25/2019 Java Programare Dinamica
39/153
Fie A i B dou mulimi oarecare (B = N, Z, R, {0,1} )
Fiecrui xA urmeaz s i se asociezeo valoare v(x)B.
x
A v x)
B
v este cunoscutdoar pe submulimea XA
-
7/25/2019 Java Programare Dinamica
40/153
Fie A i B dou mulimi oarecare (B = N, Z, R, {0,1} )
Fiecrui xA urmeaz s i se asociezeo valoare v(x)B.
x
A v x)
B
v este cunoscutdoar pe submulimea XA
Pentru fiecare x
A\X avem relaiav x) = f
x
v a
1
),...,v a
k
))
unde
A
x
= {a
1
,...,a
k
}
este mulimea elementelor din A de a cror valoaredepinde v(x)
-
7/25/2019 Java Programare Dinamica
41/153
Dat zA, se cere s se calculeze, dac este posibil,valoarea v(z) - eficient
-
7/25/2019 Java Programare Dinamica
42/153
Putem reprezenta problema pe un gr f de dependene.
Vrfurile corespund elementelor din A, iar descendenii
unui vrf x sunt vrfurile din Ax.
valoarea lui x depide
direct de v(ai)
Problema are soluie numai dac n graful de dependene nu
exist circuite accesibile din z
a
i
x
-
7/25/2019 Java Programare Dinamica
43/153
Calcul numrFibonacci FnF(n) = F(n-1)+F(n-2)
F(0) = F(1) = 1
-
7/25/2019 Java Programare Dinamica
44/153
Calcul numrFibonacci FnF(n) = F(n-1)+F(n-2)
F(0) = F(1) = 1 X ={0, 1}
0 1
2
3
4
tim iniial
-
7/25/2019 Java Programare Dinamica
45/153
Alt exempluA = {1,2,...,5,6};
v(1) = v(2) = 1v(3) = v(1) + v(2) + v(4)
v(4) = v(1) + v(2)
v(5) = v(2) + v(3)
v(6) = v(1) + v(3) + v(4)
v(6) = ?
-
7/25/2019 Java Programare Dinamica
46/153
Alt exempluA = {1,2,...,5,6};
v(1) = v(2) = 1 X = {1, 2}v(3) = v(1) + v(2) + v(4)
v(4) = v(1) + v(2)
v(5) = v(2) + v(3)
v(6) = v(1) + v(3) + v(4)
4
3
21
6 5
-
7/25/2019 Java Programare Dinamica
47/153
4
3
21
6 5
v(6) = ?
-
7/25/2019 Java Programare Dinamica
48/153
-
7/25/2019 Java Programare Dinamica
49/153
Fie Gz graful indus de mulimea vrfurilory de a crorvaloare depinde v z) = pentru care exist un drum de la y laz = vrfuriobservabile din z
Gz=
graful vrfurilor observabile din z
Problema presupune o parcurgere a grafului Gz
-
7/25/2019 Java Programare Dinamica
50/153
4
3
21
6
v(6) = ?
graful vrfurilor observabile
din 6
-
7/25/2019 Java Programare Dinamica
51/153
Ar fi bine dac
am cunoate de la nceput Gz forma acestui graf ar permite o parcurgere mai simpl,
care s conduc la calcularea valorii v(z).
-
7/25/2019 Java Programare Dinamica
52/153
ncercarede rezolvare cu metoda Divide et Impera.
procedure DivImp(x)for yAx\X {y de care x depinde direct}
DivImp(y)
calculeazv(x) conform funcieifx
end;
-
7/25/2019 Java Programare Dinamica
53/153
ncercare de rezolvare cu metoda Divide et Impera.
procedure DivImp(x)for yAx\X {y de care x depinde direct}
DivImp(y)
calculeaz v(x) conform funciei fx
end;
algoritmul nu se termin pentru grafuri ciclice
valoarea unui vrf poate fi calculat de mai multe ori
-
7/25/2019 Java Programare Dinamica
54/153
Soluie - sortarea topologic pentru Gz ordinea
ncare se
calculeazvalorile v ale
vrfurilor
Ar fi mai bine dac forma grafului ar permite o
parcurgere mai simpl.
-
7/25/2019 Java Programare Dinamica
55/153
Metoda programrii dinamice const n urmtoarele:
Se asociaz problemei un graf de dependene
-
7/25/2019 Java Programare Dinamica
56/153
Metoda programrii dinamice const n urmtoarele:
Se asociaz problemei un graf de dependene
-
7/25/2019 Java Programare Dinamica
57/153
Metoda programrii dinamice const n urmtoarele:
Se asociaz problemei un graf de dependene
n graf este pus n eviden un graf de vrfuri observabiledin z, numit PD-arbore de rdcin z, cu proprietile
-
7/25/2019 Java Programare Dinamica
58/153
Metoda programrii dinamice const n urmtoarele:
Se asociaz problemei un graf de dependene
n graf este pus n eviden un graf de vrfuri observabiledin z, numit PD-arbore de rdcin z, cu proprietile
nu conine circuite
-
7/25/2019 Java Programare Dinamica
59/153
Metoda programrii dinamice const n urmtoarele:
Se asociaz problemei un graf de dependene
n graf este pus n eviden un graf de vrfuri observabiledin z, numit PD-arbore de rdcin z, cu proprietile
nu conine circuite
mulimea vrfurilor cu gradul intern 0 (ale cror valorinu depind de o alt valoare) este inclus n X
-
7/25/2019 Java Programare Dinamica
60/153
Metoda programrii dinamice const n urmtoarele:
Se asociaz problemei un graf de dependene
n graf este pus n eviden un graf de vrfuri observabiledin z, numit PD-arbore de rdcin z, cu proprietile
nu conine circuite
mulimea vrfurilor cu gradul intern 0 (ale cror valorinu depind de o alt valoare) este inclus n X
se poate aeza pe niveluri (nivelul lui y = lungimea
maxim a unui drum de la y la z)
-
7/25/2019 Java Programare Dinamica
61/153
Metoda programrii dinamice const n urmtoarele:
Se asociaz problemei un graf de dependene
n graf este pus n eviden un graf de vrfuri observabiledin z, numit PD-arbore de rdcin z
Se parcurgenpostordine PD-arborele
procedurepostord(x)
for jAx
if viz[j]=false {diferenafade DI}
postord(j)
calculeazv(x) conform funcieif
x;
viz[x]true
end
Apelpostord(z)
-
7/25/2019 Java Programare Dinamica
62/153
4
3
21
6v(6) = ?
Prin parcurgereanpostordine, vrfurilevor fisortate topologic
-
7/25/2019 Java Programare Dinamica
63/153
Generalizeazmetoda Divide et Impera- dependenelenu au forma unui arbore, ci a unui PD-arbore.
-
7/25/2019 Java Programare Dinamica
64/153
Generalizeazmetoda Divide et Impera- dependenelenu au forma unui arbore, ci a unui PD-arbore.
Este util scutmnPD-arbore regulariticare sevite memorarea valorilor tuturor vrfurilori/sau ssimplifice parcurgereanpostordine.
-
7/25/2019 Java Programare Dinamica
65/153
A = {0,...,n}, B =N
X = {0,1} (tim F0=0; F1=1) v(k) = Fk, deci
v(k) = v(k-1)+ v(k-2)
-
7/25/2019 Java Programare Dinamica
66/153
A = {0,...,n}, B =N
X = {0,1} (tim F0=0; F1=1) v(k) = Fk, deci
v(k) = v(k-1)+ v(k-2)
Ak = {k-1,k-2}, k2
fk(a,b) = a + b, k2
-
7/25/2019 Java Programare Dinamica
67/153
A = {1,...,n}, B =N N
v(k) = (Fk-1, Fk) v(1) = (0, 1)
-
7/25/2019 Java Programare Dinamica
68/153
A = {1,...,n}, B =N N
v(k) = (Fk-1, Fk) v(1) = (0, 1)
Ak = {k-1}, k2
fk(a,b) = (b, a+b) k2
v(k) = fk(v(k-1))
-
7/25/2019 Java Programare Dinamica
69/153
A = {1,...,n}, B =N N
v(k) = (Fk-1, Fk) v(1) = (0, 1)
Ak = {k-1}, k2
fk(a,b) = (b, a+b) k2
v(k) = fk(v(k-1))
a0; b1for i=2,n
(a,b)(b,a+b)
write(b)
-
7/25/2019 Java Programare Dinamica
70/153
Se poate utiliza n problemele de optim care verific
un principiu de optimalitate, din care se obin relaiilede calcul
Fie secvena de stri S0 (starea iniial), S1, , Sn (stareafinal) ale sistemului.
-
7/25/2019 Java Programare Dinamica
71/153
Fie soluiaoptim d1, ..., dnPrincipiul
de optimalitate poate fi satisfcut sub una
din urmtoarele forme:
optim
optim
ambele subsecvenesunt optime
ir optim
d1 dn
-
7/25/2019 Java Programare Dinamica
72/153
Fie soluiaoptim d1, ..., dnPrincipiul de optimalitate poate fi satisfcut sub una
din urmtoarele forme:
1 2(1) optim optim pentru subproblema
cor
, ,...., ,....
espunzatoare,
,
1
kn nd d d d
k n
d
1 12, ,...., ,....,(3) optim optim, 1
opt
si
im,.. , 1, ..
k
k
n
n
d d dd d k n
d d k n
11 2(2) optim, ,...., ,...., optim, 1knd d d d k d n
-
7/25/2019 Java Programare Dinamica
73/153
Stabilirea subproblemelor utile (de exemplu dinprincipiul de optimalitate)
Care subprobleme le putem rezolva direct
Relaiile de recuren
Ordinea de parcurgere a grafului de dependene
ordinea de calcul)
-
7/25/2019 Java Programare Dinamica
74/153
-
7/25/2019 Java Programare Dinamica
75/153
Se consider vectorul a = a
1
,..., a
n
).
S se determine lungimea maxim a unui subir
cresctor din a i un astfel de subir de lungime
maxim
Exemplu
Pentru
a = 8, 1, 7, 4, 6, 5, 11)
lungimea maxim este 4, un subir fiind1, 4, 6, 11
-
7/25/2019 Java Programare Dinamica
76/153
Longest Increasing Subsequence
nrudit cu problema determinrii celui mai lung subir
comun a dou iruri
(Longest Common Subsequence)
Aplicaii
cautarea de tiparuri (patterns):
baze de date maribioinformatica
similitudinin genetic(ADN)
sequence alignment
Lavanya, B., Murugan, A.: Discovery of longest increasingsubsequences and its variants using DNA operations.
International Journal of Engineering and Technology 5(2),
11691177 (2013)
-
7/25/2019 Java Programare Dinamica
77/153
Principiu de optimalitate:
Dac
ai1, ai2, , aip,
este un subiroptim care ncepepe poziia
i1, atunci:
ai2, , aip
este un
subir
optim care
ncepe
pe
poziia
i2;
Mai general
aik, , aip
este un
subir
optim care
ncepe
pe
poziia
ik.
-
7/25/2019 Java Programare Dinamica
78/153
Principiu de optimalitate
Subprobleme:
Calculmpentru fiecare poziiei lungimea maxima
unui subircresctorce ncepepe poziiai (cu elementulai)
-
7/25/2019 Java Programare Dinamica
79/153
Subproblem:
lung[i] = lungimea maxima unui subir
cresctorcencepepe poziiai
-
7/25/2019 Java Programare Dinamica
80/153
Subproblem:
lung[i] = lungimea maxima unui subir
cresctorcencepepe poziiai
Soluie problem:
nr = max{lung[i]i = 1,2,,n}
-
7/25/2019 Java Programare Dinamica
81/153
Subproblem:
lung[i] = lungimea maxima unui subir
cresctorcencepepe poziiai
Soluie problem:
nr = max{lung[i]i = 1,2,,n}
-
7/25/2019 Java Programare Dinamica
82/153
Subproblem:
lung[i] = lungimea maxima unui subir
cresctorcencepepe poziiai
tim direct
Relaie de recuren
Ordinea de parcurgere a grafului de dependene
ordinea de calcul)
-
7/25/2019 Java Programare Dinamica
83/153
Subproblem:
lung[i] = lungimea maxima unui subir
cresctorcencepepe poziiai
tim direct lung[n] = 1
Relaie de recuren
lung[i] = 1 + max{lung[j]j>i , ai
-
7/25/2019 Java Programare Dinamica
84/153
Subproblem:
lung[i] = lungimea maxima unui subir
cresctorcencepepe poziiai
tim direct lung[n] = 1
Relaie de recuren
lung[i] = 1 + max{lung[j]j>i, ai
-
7/25/2019 Java Programare Dinamica
85/153
Graful de dependen
e
i = n, n-1, , 1
n
2
1
-
7/25/2019 Java Programare Dinamica
86/153
Graful de dependen
e
Ordinea de parcurgere a grafului de dependene
ordinea de calcul)
i = n, n-1, ,1n, n-1, , 1
n
2
1
-
7/25/2019 Java Programare Dinamica
87/153
Cum determinmun subir maxim?
-
7/25/2019 Java Programare Dinamica
88/153
Pentru a determina i un subir optimputem memoran plus
succ[i] = indicele urmtorului elementdintr-un subir optim care ncepepe poziia i (n+1dac nu exist)
=indicele pentru care se realizeaz
maximul n relaia de recuren
-
7/25/2019 Java Programare Dinamica
89/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2
succ : 7 4 7 5 7 7
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
90/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
91/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
92/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
93/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
94/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
95/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
96/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
97/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
98/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
99/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
100/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
101/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
102/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
103/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
Solu
ie
: lung = 4
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
104/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
Sub
ir
: 1,
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
105/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
Sub
ir
: 1,
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
106/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
Sub
ir
: 1, 4,
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
107/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
Sub
ir
: 1, 4, 6
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
108/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2 1
succ : 7 4 7 5 7 7 8
Sub
ir
: 1, 4, 6, 11
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
109/153
nr= 1;
poz = n; //poz de inceput a sirului maxim
-
7/25/2019 Java Programare Dinamica
110/153
lung[n] = 1; succ[n] = n+1; //stim
for (int i=n-1;i>=1;i--){//ordine de calculsucc[i]= n+1; lung[i]=1;
//formula de recurenta
for(int j=i+1;j nr){nr= lung[i]; poz = i;}
}
nr= 1;
poz = n; //poz de inceput a sirului maxim
-
7/25/2019 Java Programare Dinamica
111/153
lung[n] = 1; succ[n] = n+1; //stim
for (int i=n-1;i>=1;i--){//ordine de calculsucc[i]= n+1; lung[i]=1;
//formula de recurenta
for(int j=i+1;j nr){nr= lung[i]; poz = i;}
}
nr= 1;
poz = n; //poz de inceput a sirului maxim
-
7/25/2019 Java Programare Dinamica
112/153
lung[n] = 1; succ[n] = n+1; //stim
for (int i=n-1;i>=1;i--){//ordine de calculsucc[i]= n+1; lung[i]=1;
//formula de recurenta
for(int j=i+1;j nr){nr= lung[i]; poz = i;}
}
nr= 1;
poz = n; //poz de inceput a sirului maxim
-
7/25/2019 Java Programare Dinamica
113/153
lung[n] = 1; succ[n] = n+1; //stim
for (int i=n-1;i>=1;i--){//ordine de calculsucc[i]= n+1; lung[i]=1;
//formula de recurenta
for(int j=i+1;j nr){nr= lung[i]; poz = i;}
}
nr= 1;
poz = n; //poz de inceput a sirului maxim
-
7/25/2019 Java Programare Dinamica
114/153
lung[n] = 1; succ[n] = n+1; //stim
for (int i=n-1;i>=1;i--){//ordine de calculsucc[i]= n+1; lung[i]=1;
//formula de recurenta
for(int j=i+1;j nr){nr= lung[i]; poz = i;}
}
nr= 1;
poz = n; //poz de inceput a sirului maxim
-
7/25/2019 Java Programare Dinamica
115/153
lung[n] = 1; succ[n] = n+1; //stim
for (int i=n-1;i>=1;i--){//ordine de calculsucc[i]= n+1; lung[i]=1;
//formula de recurenta
for(int j=i+1;j nr){nr= lung[i]; poz = i;}
}
//afisare subsir
-
7/25/2019 Java Programare Dinamica
116/153
//afisare subsir
for (int i=1;i
-
7/25/2019 Java Programare Dinamica
117/153
//a sa e subs
for (int i=1;i
-
7/25/2019 Java Programare Dinamica
118/153
//
for (int i=1;i
-
7/25/2019 Java Programare Dinamica
119/153
Principiu de optimalitate:
Dac
ai1, ai2, , aip,
este un subiroptim care se termin pe poziiaip,
atunci
ai1, , aikeste un
subir
optim care
se termin
pe
poziia
ik.
Subproblem:
Calculmpentru fiecare poziiei lungimea maxima
subiruluicresctorce se terminpe poziiai
Alt soluie
-
7/25/2019 Java Programare Dinamica
120/153
Principiu de optimalitate:
Dac
ai1, ai2, , aip,
este un subiroptim care se termin pe poziiaip,
atunci
ai1, , aikeste un
subir
optim care
se termin
pe
poziia
ik.
Subproblem:
Calculmpentru fiecare poziiei lungimea maxima
subiruluicresctorce se terminpe poziiai
Alt soluie
-
7/25/2019 Java Programare Dinamica
121/153
Principiu de optimalitate:
Dac
ai1, ai2, , aip,
este un subiroptim care se termin pe poziiaip,
atunci
ai1, , aikeste un
subir
optim care
se termin
pe
poziia
ik.
Subproblem:
Calculmpentru fiecare poziiei lungimea maxima
unui subircresctorce se terminpe poziiai
-
7/25/2019 Java Programare Dinamica
122/153
a: 8 1 7 4 6 5 11
lung : 2 4 2 3 2 2
pred : 7 4 7 5 7 7
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
123/153
a: 8 1 7 4 6 5 11
lung : 12 4 2 3 2 2
pred : 07 4 7 5 7 7
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
124/153
a: 8 1 7 4 6 5 11
lung : 1 14 2 3 2 2
pred : 07 0 4 7 5 7 7
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
125/153
a: 8 1 7 4 6 5 11
lung : 1 14 2 2 3 2 2
pred : 07 0 2 7 5 7 7
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
126/153
a: 8 1 7 4 6 5 11
lung : 1 14 2 223 2 2
pred : 07 0 2 2 5 7 7
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
127/153
a: 8 1 7 4 6 5 11
lung : 1 14 2 223 3 2 2
pred : 07 0 2 2 4
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
128/153
a: 8 1 7 4 6 5 11
lung : 1 14 2 223 3 2 32
pred : 07 0 2 2 4 4
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
129/153
a: 8 1 7 4 6 5 11
lung : 1 14 2 223 3 2 3 4
pred : 07 0 2 2 4 4 6
1 2 3 4 5 6 7
-
7/25/2019 Java Programare Dinamica
130/153
Algoritm O n log n)- Indicaii
1. Folosind tot programare dinamic
Pentru fiecare lungime j=1..,n reinem
m[j] = poziia celui mai mic element din ir cu
proprietatea c exist un subir de lungime j care se
termin cu el
a[m[1]] a[m[2]] a[m[n]]
La pasul i cutmbinar cea mai mare lungime j cu
a[m[j]] a[i]
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
131/153
prima
carte
Numr minim de teancuri
https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdf
Patience solitaire / patience sort
https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdf -
7/25/2019 Java Programare Dinamica
132/153
prima
carte
https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/
LongestIncreasingSubsequence.pdf
Numr minim de teancuri
Patience solitaire
https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdfhttps://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdf -
7/25/2019 Java Programare Dinamica
133/153
Algoritm: Greedy cartea curent este adugat la cel mai
din stnga teanc pe care se potrivete
- La fiecare pas, crile din topul fiecrui teanc formeaz un ir
cresctor
- Determinarea celui mai din stnga teanc pe care se potrivete
cartea cu cutare binar
- O n log n)
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
134/153
6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
135/153
6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13
6
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
136/153
6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13
6
3
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
137/153
6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13
6 5
3
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
138/153
6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13
6 5 10
3
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
139/153
6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13
6 5 10 12
3
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
140/153
6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13
6 5 10 12
3
2
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
141/153
6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13
6 5 10 12
3 9
2
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
142/153
6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13
6 5 10 12 15
3 9
2
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
143/153
6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13
6 5 10 12 15
3 9 14
2
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
144/153
6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13
6 5 10 12 15
3 9 14
2 7
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
145/153
6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13
6 5 10 12 15
3 4 9 14
2 7
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
146/153
6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13
6 5 10 12 15
3 4 9 8 14
2 7
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
147/153
6, 3, 5, 10, 12,2, 9, 15, 14, 7, 4,8,13
6 5 10 12 15
3 4 9 8 14
2 7 13
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
148/153
Evident: numrul minim de subiruri descresctoare n
care se poate descompune un ir lungimea maxim a unui subir cresctor
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
149/153
Proprietate: numrul minim de subiruri descresctoare n
care se poate descompune un ir =lungimea maxim a unui subir cresctor
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
150/153
Proprietate: numrul minim de subiruri descresctoare n
care se poate descompune un ir =lungimea maxim a unui subir cresctor
Pentru a memora un subir cresctor, memorm la fiecare pas al
algoritmului Greedy, pentru cartea curent adugat o legtur de tip
predecesor ctre vrful teancului anterior celui n care a fost
adugat
Subirul cresctor se obine pornind de la ultima carte adugat i
urmnd legtura predecesor
Patience solitaire / patience sort
-
7/25/2019 Java Programare Dinamica
151/153
prima
carte
https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdf
>:D