Изменения

Перейти к: навигация, поиск

Динамика по поддеревьям

733 байта убрано, 22:47, 1 января 2014
Реализация
===Реализация===
Заполним изначально массив <tex>dp[V][2]</tex> числами -1. (<tex>V</tex> {{---}} число вершин)== Псевдокод ==
calculate dfs(v, useRootint x): if dp for child : Ch[vx] dfs(child); a[useRootx] != -1: return dpmax(a[vx], b[useRootchild] //вернули уже посчитанное значение dp+ w[vertexx][rootchild] - с[child]); sum = 0 if useRoot == 0: //случай 1: не берем ребра из корня for (для) всех u из множества детей v: sum b[x] += calculate(u, 1) dpс[vchild]; a[useRootx] += sum else: //случай 2: берем какое-то ребро max1 = dpb[vx] c[0x] for (для) всех x из множества детей v: max1 = max(max1, calculate(a[x], 0) + calculate(vertex, 0) - calculate(x, 1) + wb[v,x]); dp[v][useRoot] = max1 dfs(root); return dpc[v][useRootroot];
== Амортизированные оценки для ДП на дереве ==
14
правок

Навигация