Sunteți pe pagina 1din 7

19.06.

2014 Curs 5 Programare dinamic 1


irul lui Fibonacci (Top-down)
Combinri (Bottom-up)
Aplicaii
automatizri: transformarea unor cuvinte printr-un numr minim
de pai prin a (adugare liter), m (modificare liter), s
(tergere liter)
Dijkstra (doar selecia este Greedy)
ir cresctor de lungime maxim, nmulire matrice, secvena
cea mai lung comun unor iruri de caractere

19.06.2014 Curs 5 Programare dinamic 2
Curs 6 - Programare dinamic
se determin un algoritm pentru soluia optim
exist o variant recursiv a algoritmului
se mparte problema n subprobleme
se calculeaz de jos n sus soluiile (Bottom-Up)
sau se calculeaz de sus n jos soluiile (Top-
down)
se memoreaz soluiile calculate anterior
!!! Optimul global determin optimul parial
19.06.2014 Curs 5 Programare dinamic 3
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);
}
5
4
3
3
2 2 1
2 1
1 0 1 0
1 0
2
n-1
-2 reapelri O(2
n
)
19.06.2014 Curs 5 Programare dinamic 4
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 reapelri O(n)
19.06.2014 Curs 5 Programare dinamic 5
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 reapelri O(n)
19.06.2014 Curs 5 Programare dinamic 6
Curs 6 - Programare dinamic
Combinri C
n
k
(D&I)

int combinari_rec(int n, int k){
if (k == 0) return 1;
if (n == 0) return 0;
return combinari_rec(n-1, k) + combinari_rec(n-1, k-1);
}
C
n
k
reapelri O(C
n
k
)
n/k 0 1 2 3 4 5 6 7 8 9 10 11 12
0 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0 0 0 0 0
2 1 2 1 0 0 0 0 0 0 0 0 0 0
3 1 3 3 1 0 0 0 0 0 0 0 0 0
4 1 4 6 4 1 0 0 0 0 0 0 0 0
5 1 5 10 10 5 1 0 0 0 0 0 0 0
6 1 6 15 20 15 6 1 0 0 0 0 0 0
7 1 7 21 35 35 21 7 1 0 0 0 0 0
8 1 8 28 56 70 56 28 8 1 0 0 0 0
9 1 9 36 84 126 126 84 36 9 1 0 0 0
10 1 10 45 120 210 252 210 120 45 10 1 0 0
11 1 11 55 165 330 462 462 330 165 55 11 1 0
12 1 12 66 220 495 792 924 792 495 220 66 12 1
19.06.2014 Curs 5 Programare dinamic 7
Curs 6 - Programare dinamic
Combinri C
n
k
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(n
2
)

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