Sunteți pe pagina 1din 7

• Şirul lui Fibonacci (Top-down)

• Combinări (Bottom-up)
• Aplicaţii
– automatizări: transformarea unor cuvinte printr-un număr minim
de paşi prin a (adăugare literă), m (modificare literă), s
(ştergere literă)
– Dijkstra (doar selecţia este Greedy)
– Şir crescător de lungime maximă, înmulţire matrice, secvenţa
cea mai lungă comună unor şiruri de caractere

08.12.21 Curs 5 – Programare dinamică 1


Curs 6 - Programare dinamică
• se determină un algoritm pentru soluţia optimă
• există o variantă recursivă a algoritmului
• se împarte problema în subprobleme
• se calculează de jos în sus soluţiile (Bottom-Up)
• sau se calculează de sus în jos soluţiile (Top-
down)
• se memorează soluţiile calculate anterior
!!! Optimul global determină optimul parţial

08.12.21 Curs 5 – Programare dinamică 2


Curs 6 - Programare dinamică
• Şirul lui Fibonacci (D&I)
int fibonacci_rec(int n){
if(n==0) return 0;
if(n==1) return 1;
return fibonacci_rec(n-2) + fibonacci_rec(n-1);
}
2n-1-2 reapelări  O(2n)
5

4 3

3 2 2 1

2 1 1 0 1 0

1
08.12.21 0 Curs 5 – Programare dinamică 3
Curs 6 - Programare dinamică
• Şirul lui Fibonacci
#define N 20
int memo[N]; //variabilă globală

int fibonacci_pd1(int n){


if(n==0) return 0;
if(n==1) return 1;
if (memo[n-2]) return memo[n-2];
memo[n-2]=fibonacci_pd1(n-2)+fibonacci_pd1(n-1);
return memo[n-2];
}

n+1 reapelări  O(n)

08.12.21 Curs 5 – Programare dinamică 4


Curs 6 - Programare dinamică
• Şirul lui Fibonacci
int fibonacci_pd2(int n){
if(n==0) return 0;
if(n==1) return 1;
static int memo_local[N];

if (memo_local[n-2]) return memo_local[n-2];

memo_local[n-2]=fibonacci_pd2(n-2)+fibonacci_pd2(n-1);
return memo[n-2];
}

n+1 reapelări  O(n)

08.12.21 Curs 5 – Programare dinamică 5


Curs 6 - Programare dinamică
• Combinări Cnk (D&I)
int combinari_rec(int n, int k){
Cnk reapelări  O(Cnk)
if (k == 0) return 1;
if (n == 0) return 0;
return combinari_rec(n-1, k) + combinari_rec(n-1, k-1);
}
n/k 0 1 2 3 4 5 6 7 8 9 10 11 12
01 0 0 0 0 0 0 0 0 0 0 0 0
11 1 0 0 0 0 0 0 0 0 0 0 0
21 2 1 0 0 0 0 0 0 0 0 0 0
31 3 3 1 0 0 0 0 0 0 0 0 0
41 4 6 4 1 0 0 0 0 0 0 0 0
51 5 10 10 5 1 0 0 0 0 0 0 0
61 6 15 20 15 6 1 0 0 0 0 0 0
71 7 21 35 35 21 7 1 0 0 0 0 0
08.12.21 81 8 28 56
Curs70 56 28 dinamică
5 – Programare 8 1 0 0 0 0 6
Curs 6 - Programare dinamică
• Combinări Cnk
int combinari_pd(int n, int k){
static int comb[N+1][N+1];
for (int k_index = 1; k_index <= k; k_index++) comb[0][k_index] = 0;
for (int n_index = 0; n_index <= N; n_index++) comb[n_index][0] = 1;

for (int n_index = 1; n_index <= n; n_index++)


for (int k_index = 1; k_index <= k; k_index++)
comb[n_index][k_index] = comb[n_index-1][k_index-1] +
comb[n_index-1][k_index];
return comb[n][k];
}

O(n2)
08.12.21 Curs 5 – Programare dinamică 7

S-ar putea să vă placă și