Diferente pentru all-you-can-code-2008/solutii/treesearch intre reviziile #2 si #8

Diferente intre titluri:

all-you-can-code-2008/treesearch
Tree Search

Diferente intre continut:

h2(#treesearch). 'Tree Search':problema/treesearch
Problema se rezolva prin programare dinamica. Presupunem ca agatam arborele intr-un nod oarecare. Folosind DFS, calculam P[$i$] = costul maxim al unui drum care contine drept capat nodul i, si contine doar noduri din subarborele lui i. Relatia de recurenta se determina relativ simplu: P[i] = C[i], daca i este nod terminal, iar P[$i$] = max ( C[$i$], C[$i$] + P[$k$] ), pentru $k$ - adiacent a lui $i$ ( diferit de tatal lui $i$ ). De asemenea, mai trebuie calculat si un vector de tati: tata[x] = tatal nodului x. Avand acesti vectori calculati, mai trebuie sa determinam drumul de cost maxim care are drept extremitate nodul i, si pleaca "in sus". Astfel, notam cu T[$i$] - costul maxim al unui drum care pleaca din i, "in sus". Pentru a calcula acest vector, ne trebuie cate o parcurgere DF pt fiecare fiu al radacinii. Presupunem ca dorim sa calculam T[] pentru subarborele $k$ al radacinii (asadar, $k$ este fiu al radacinii). Trebuie sa procedam astfel:
Problema se rezolva prin programare dinamica. Presupunem ca agatam arborele intr-un nod oarecare. Folosind DFS, calculam P[ $i$ ] = costul maxim al unui drum care contine drept capat nodul $i$, si contine doar noduri din subarborele lui $i$. Relatia de recurenta se determina relativ simplu: P[ $i$ ] = C[ $i$ ], daca $i$ este nod terminal, iar P[ $i$ ] = max ( C[ $i$ ], C[ $i$ ] + P[ $k$ ] ), pentru $k$ - adiacent a lui $i$ ( diferit de tatal lui $i$ ). De asemenea, mai trebuie calculat si un vector de tati: tata[ $x$ ] = tatal nodului $x$. Avand acesti vectori calculati, mai trebuie sa determinam drumul de cost maxim care are drept extremitate nodul $i$, si pleaca "in sus". Astfel, notam cu T[ $i$ ] - costul maxim al unui drum care pleaca din $i$, "in sus". Pentru a calcula acest vector, ne trebuie cate o parcurgere DF pt fiecare fiu al radacinii. Presupunem ca dorim sa calculam $T$[] pentru subarborele $k$ al radacinii (asadar, $k$ este fiu al radacinii). Trebuie sa procedam astfel:
* T[$radacina$] se initializeaza cu max ( C[$radacina$], P[$j$] ), unde $j$ este un fiu al radacinii, diferit de $k$.
* Aplicam un algoritm de tip DF, avand ca punct de plecare $k$. Pentru fiecare nod x pe care il parcurgem (avand tatal t) calculam T[$x$] = max ( C[$x$], C[$x$] + T[$t$], C[$x$] + C[$t$] + P[$j$]), unde $j$ este un fiu al lui $t$, diferit de $i$ si diferit de $tata[$t$]$.
* T[ $radacina$ ] se initializeaza cu max ( C[ $radacina$ ], P[ $j$ ] ), unde $j$ este un fiu al radacinii, diferit de $k$.
* Aplicam un algoritm de tip DF, avand ca punct de plecare $k$. Pentru fiecare nod $x$ pe care il parcurgem (avand tatal $t$) calculam T[ $x$ ] = max ( C[ $x$ ], C[ $x$ ] + T[ $t$ ], C[ $x$ ] + C[ $t$ ] + P[ $j$ ]), unde $j$ este un fiu al lui $t$, diferit de $i$ si diferit de $tata[$t$]$. Continuam parcurgerea cu fiecare subarbore a lui $x$ (considerand radacina tot nodul $radacina$)
Asadar, putem acum calcula $bst[$x$]$ = costul maxim al unui drum care contine nodul $x$, pe baza lui $P$ si a lui $T$. Relatia de recurenta se determina usor. Avand acest vector calculat, putem raspunde in O(1) pe query. Asadar complexitatea programului va fi O(N+M).
Asadar, putem acum calcula $bst[ $x$ ]$ = costul maxim al unui drum care contine nodul $x$, pe baza lui $P$ si a lui $T$. Relatia de recurenta se determina usor. Avand acest vector calculat, putem raspunde in O(1) pe query. Asadar complexitatea programului va fi O( $N$ + $M$ ).
Observatie: Pentru a calcula cel mai mare fiu al radacinii, diferit de fiul $k$, se va folosi un deque, altfel algoritmul putand deveni O($N^2$), in caz contrar.
Observatie: Pentru a calcula cel mai mare fiu al radacinii, diferit de fiul $k$, se va folosi un deque, altfel algoritmul putand deveni O( $N$ ^ $2$).

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.