Java Programare Dinamica
Java Programare Dinamica
Exemplu
Pentru
w = (1, 4, 7, 5)
soluia este
(4, 5)
Problem echivalent
Recuren:
Notm S(i) = ponderea maxim a unei mulimi
independete n graful indus de vrfurile {v1,..., vi}
S(n)
S(n-1)
S(n-2)
S(n-3)
S(n-2)
S(n-3)
S(n-3)
S(n-4)
S(n-4)
Subproblemele se repet algoritm exponenial
S(n)
S(n-1)
S(n-2)
S(n-3)
S(n-2)
S(n-3)
S(n-3)
S(n-4)
S(n-4)
Putem evita rezolvarea unei subprobleme de mai
multe ori?
Recuren:
S(n)= max{ S(n-2)+wn, S(n-1)}
Memorm ntr-un vector rezultatele subproblemelor
deja rezolvate (memoizare) o subproblem va fi
rezolvat o singur dat algoritm O(n)
S(4)
S(3)
S(2)
S(0)
S(1)
for(int i=0;i<=n;i++)
s[i]=0;
System.out.println(Sol(n));
s[i]= Math.max(s[i-2]+w[i],s[i-1]);
}
if(i==1)
System.out.println(i+" de pondere "+w[i]);
}
s[i]= Math.max(s[i-2]+w[i],s[i-1]);
}
if(i==1)
System.out.println(i+" de pondere "+w[i]);
}
s[i]= Math.max(s[i-2]+w[i],s[i-1]);
}
if(i==1)
System.out.println(i+" de pondere "+w[i]);
}
Alte exemple:
Problema rucsacului, cazul discret
Problema monedelor, cazul general
F(4)
F(3)
F(1) F(1)
F(2)
F(1)
F(2)
F(0)
F(0)
F(4)
F(3)
F(1) F(1)
F(2)
F(1)
F(2)
F(0)
F(0)
Soluii
reducere la subprobleme utile + relaii de recuren
rezolvarea eficient a subproblemelor
recursiv cu memoizare (salvarea rezultatelor subproblemelor
deja rezolvate)
algoritmi iterativi buttom-up
direct de v(ai)
Alt exemplu
A = {1,2,...,5,6};
v(1) = v(2) = 1
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)
v(6) = ?
Alt exemplu
A = {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)
3
4
v(6) = ?
3
4
v(6) = ?
5 nu intervine n calculul
lui v(6)
v(6) = ?
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).
DivImp(y)
calculeaz v(x) conform funciei fx
end;
DivImp(y)
calculeaz v(x) conform funciei fx
end;
algoritmul nu se termin pentru grafuri ciclice
procedure postord(x)
for jAx
if viz[j]=false {diferena fa de DI}
postord(j)
calculeaz v(x) conform funciei fx;
viz[x]true
end
Apel postord(z)
v(6) = ?
3
4
A = {0,...,n},
B = N
v(k) = Fk , deci
v(k) = v(k-1)+ v(k-2)
A = {0,...,n},
B = N
v(k) = Fk , deci
v(k) = v(k-1)+ v(k-2)
Ak = {k-1,k-2}, k2
fk(a,b) = a + b, k2
A = {1,...,n},
v(1) = (0, 1)
B = N N
A = {1,...,n},
v(1) = (0, 1)
B = N N
Ak = {k-1}, k2
fk(a,b) = (b, a+b) k2
v(k) = fk(v(k-1))
A = {1,...,n},
v(1) = (0, 1)
B = N N
Ak = {k-1}, k2
fk(a,b) = (b, a+b) k2
v(k) = fk(v(k-1))
a0; b1
for i=2,n
(a,b)(b,a+b)
write(b)
d1
dn
optim
ir optim
ambele subsecvene
sunt optime
Relaiile de recuren
Exemplu
Pentru
a = (8, 1, 7, 4, 6, 5, 11)
4, 6,
11
Principiu de optimalitate:
Dac
ai1, ai2, , aip,
este un subir optim care ncepe pe 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.
Principiu de optimalitate
Subprobleme:
Calculm pentru fiecare poziie i lungimea maxim a
unui subir cresctor ce ncepe pe poziia i (cu elementul
ai)
Subproblem:
lung[i] = lungimea maxim a unui subir
cresctor ce ncepe pe poziia i
Subproblem:
lung[i] = lungimea maxim a unui subir
cresctor ce ncepe pe poziia i
Soluie problem:
nr = max{lung[i]i = 1,2,,n}
Subproblem:
lung[i] = lungimea maxim a unui subir
cresctor ce ncepe pe poziia i
Soluie problem:
nr = max{lung[i]i = 1,2,,n}
Subproblem:
lung[i] = lungimea maxim a unui subir
cresctor ce ncepe pe poziia i
tim direct
Relaie de recuren
Subproblem:
lung[i] = lungimea maxim a unui subir
cresctor ce ncepe pe poziia i
tim direct
lung[n] = 1
Relaie de recuren
lung[i] = 1 + max{lung[j]j>i , ai<aj}
Ordinea de parcurgere a grafului de dependene
(ordinea de calcul)
i = n, n-1, , 1
Subproblem:
lung[i] = lungimea maxim a unui subir
cresctor ce ncepe pe poziia i
tim direct
lung[n] = 1
Relaie de recuren
lung[i] = 1 + max{lung[j]j>i, ai<aj}
Ordinea de parcurgere a grafului de dependene
(ordinea de calcul)
i = n, n-1, , 1
Graful de dependene
i =1n, n-1, , 1
2
Graful de dependene
1
2
a:
5 11
lung : 2
succ : 7
a:
5 11
lung : 2
succ : 7
a:
5 11
lung : 2
succ : 7
a:
5 11
lung : 2
succ : 7
a:
5 11
lung : 2
succ : 7
a:
5 11
lung : 2
succ : 7
a:
5 11
lung : 2
succ : 7
a:
5 11
lung : 2
succ : 7
a:
5 11
lung : 2
succ : 7
a:
5 11
lung : 2
succ : 7
a:
5 11
lung : 2
succ : 7
a:
5 11
lung : 2
succ : 7
a:
5 11
lung : 2
succ : 7
a:
5 11
lung : 2
succ : 7
a:
5 11
lung : 2
succ : 7
Soluie: lung = 4
a:
5 11
lung : 2
succ : 7
Subir: 1,
a:
5 11
lung : 2
succ : 7
Subir: 1,
a:
5 11
lung : 2
succ : 7
Subir: 1, 4,
a:
5 11
lung : 2
succ : 7
Subir: 1, 4, 6
a:
5 11
lung : 2
succ : 7
Subir: 1, 4, 6, 11
nr = 1;
nr = 1;
nr = 1;
nr = 1;
nr = 1;
nr = 1;
//afisare subsir
for (int i=1;i<=nr;i++){
System.out.print(a[poz]+" ");
poz = succ[poz];
}
//afisare subsir
for (int i=1;i<=nr;i++){
System.out.print(a[poz]+" ");
poz = succ[poz];
}
Complexitate - O(n2)
//afisare subsir
for (int i=1;i<=nr;i++){
System.out.print(a[poz]+" ");
poz = succ[poz];
}
Complexitate - O(n2)
Alt soluie
Principiu de optimalitate:
Dac
ai1, ai2, , aip,
este un subir optim care se termin pe poziia ip,
atunci
ai1, , aik
este un subir optim care se termin pe poziia ik.
Subproblem:
Calculm pentru fiecare poziie i lungimea maxim a
subirului cresctor ce se termin pe poziia i
Alt soluie
Principiu de optimalitate:
Dac
ai1, ai2, , aip,
este un subir optim care se termin pe poziia ip,
atunci
ai1, , aik
este un subir optim care se termin pe poziia ik.
Subproblem:
Calculm pentru fiecare poziie i lungimea maxim a
subirului cresctor ce se termin pe poziia i
Alt soluie
Principiu de optimalitate:
Dac
ai1, ai2, , aip,
este un subir optim care se termin pe poziia ip,
atunci
ai1, , aik
este un subir optim care se termin pe poziia ik.
Subproblem:
Calculm pentru fiecare poziie i lungimea maxim a
unui subir cresctor ce se termin pe poziia i
a:
5 11
lung : 2
pred : 7
a:
8
1
lung : 12
pred : 07
1
2
7
4
4
4
2
7
6
3
5
5 11
2
7
2
7
a:
8
1
lung : 1
1
2
14
pred : 07 0 4
4
2
7
6
3
5
5 11
2
7
2
7
a:
8
1
lung : 1
1
2
7
3
142 2
pred : 07 0
2 7
6
3
5 11
2
a:
8
1
lung : 1
1
2
7
3
4
4
1 4 2 22 3
pred : 07 0
6
5
2 5
5 11
2
a:
8
1
lung : 1
1
2
7
3
4
4
6
5
5 11
6
1 4 2 22 3 3 2 2
pred : 07 0
a:
8
1
lung : 1
1
2
7
3
4
4
6
5
5 11
6
1 4 2 22 3 3 2 32
pred : 07 0
a:
8
1
lung : 1
1
2
7
3
4
4
6
5
5 11
6
1 4 2 22 3 3 2 3
pred : 07 0
4
6
prima
carte
https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/
LongestIncreasingSubsequence.pdf
prima
carte
https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/
LongestIncreasingSubsequence.pdf
Patience solitaire
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)
6
3
6
3
6
3
10
6
3
10
12
6
3
2
10
12
6
3
2
10
9
12
6
3
2
10
9
12
15
6
3
2
10
9
12
15
14
6
3
2
10
9
7
12
15
14
6
3
2
5
4
10
9
7
12
15
14
6
3
2
5
4
10
9
7
12
8
15
14
6
3
2
5
4
10
9
7
12
8
15
14
13
prima
carte
>:D<
https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/
LongestIncreasingSubsequence.pdf
Patience sort
-dup distribuirea crilor n teancuri alegem succesiv
cartea cu cea mai mic valoare din vrful unui teanc i o
adugm n ir