===Псевдокод===
function calculate(vvertex, rootuse_root): if dp[vvertex][root] != -1: return dp[vvertex][rootuse_root] # //вернули уже посчитанное значение dp[vvertex][root] sum1 sum = 0 #if use_root == 0: //случай 1: не берем ребра из корня if root==0: for u in child(vvertex): sum1 sum += calculate(u, 1) #выполняем мемоизацию dp[vvertex][rootuse_root] = sum1sum //выполняем мемоизацию return sum1sum max1 = dp[vvertex][0] #for x in child(vertex): //случай 2: берем какое-то ребро for x in child(v): max1 = max(max1, calculate(x, 0) + calculate(vvertex, 0) - calculate(x, 1) + w[vvertex,x]) # выполняем мемоизацию dp[vvertex][rootuse_root] = max1 //выполняем мемоизацию return dp[vvertex][rootuse_root]
==Ссылки==