Pagini recente » Diferente pentru pd intre reviziile 36 si 35 | Diferente pentru teoria-jocurilor/numere-sg intre reviziile 3 si 4 | Concursuri Virtuale | Autentificare | Diferente pentru pd intre reviziile 37 si 36
Diferente pentru
pd intre reviziile
#37 si
#36
Nu exista diferente intre titluri.
Diferente intre continut:
Acum devine clară o primă soluţie folosind programarea dinamică. Astfel, să presupunem că notăm cu @opt[ i ][ j ]@ costul minim al unui arbore construit pe cheile din $[i,j]$ (prin asta notăm (i, i + 1, ..., j). Fie $r[ i ][ j ]$ poziţia rădăcinii arborelui cu costul minim. În cazul existenţei mai multor rădăcini posibile, se alege cea mai din stânga. Cum am putea construi arborele de cost minim pe cheile $[i,j]$ ştiind răspunsul pentru instanţele mai mici (subsecvenţele de lungime mai mică ca $j-i+1$ pe $[i,j]$)? (!) Simplu, arborele de cost minim pe $[i,j]$ se obţine alegând drept rădăcină în mod optim o poziţie $k$, cu <tex>$i \le k \le j$</tex>, la care se pune ca fiul stâng arborele optim pentru $[i, k-1]$, şi ca fiu drept arborele optim pentru $[k+1, j]$. Relaţia de recurenţă devine:
@opt[ i ][ j ]@ = <tex>\displaystyle\min_{i \le k \le j} \{a_{k} + \max( opt[i][k-1], opt[k+1][j] )\} </tex>
@r[ i ][ j ]@ = <tex>\displaystyle\arg \min_{i \le k \le j}\{a_{k} + \max (opt[i][k-1], opt[k+1][j] )\} </tex>
<tex>opt[ i ][ j ] = \displaystyle\min_{i \le k \le j} \{a_{k} + \max( opt[i][k-1], opt[k+1][j] )\} </tex>
<tex>r[ i ][ j ] = \displaystyle\arg \min_{i \le k \le j}\{a_{k} + \max (opt[i][k-1], opt[k+1][j] )\} </tex>
Avem @opt[i][j] = 0@, pentru $j < i$.
Cazurile de bază sunt @opt[i][i]@ = a{~i~} si @r[i][i] = i@.
Astfel, am obţinut o soluţie în timp O(N^3).
Aici trebuie remarcată asemănarea acestei probleme cu cea a determinării arborelui de căutare optim, atunci cand se dau probabilităţile relative de căutare a cheilor. Această problemă se numeşte 'Optimal Binary Search Tree' în literatura de specialitate şi poate fi găsită şi în _Introduction to Algorithms_. În aceasta problemă, se poate aplica o proprietate specială, numită _convexitate_, pentru a reduce complexitatea la $O(N^2)$. Această proprietate reprezintă un concept avansat, care nu se poate aplica în cazul problemei noastre, şi nu va fi discutat în continuare.
Până acum avem următorul pseudocod pentru calculul recurenţei:
== code(cpp) |
Algoritmul este:
iniţializează opt şi r
pentru len = 1, N execută
pentru i = 1, N - len + 1 execută
j = i + len - 1;
opt[i][j] = inf;
pentru k = i, j execută
dacă opt[i][j] < a[k] + max(opt[i][k-1], opt[k+1][j]) atunci
opt[i][j] = a[k] + max(opt[i][k-1], opt[k+1][j]);
r[i][j] = k;
sfârşit_pentru;
sfârşit_pentru;
sfârşit_pentru;
return opt[1][N];
Sfârşit.
==
[]
h2. Programare dinamica folosind bitmask
Nu exista diferente intre securitate.
Topicul de forum nu a fost schimbat.