假设左边黑点的个数是x,且其左边节点个数是size, 树的总结点个数为n,则这条边计算次数有下面的公式
t
o
t
=
x
×
(
k
−
x
)
+
(
s
i
z
e
−
x
)
×
(
n
−
s
i
z
e
−
k
+
x
)
tot = x \times (k - x) + (size - x) \times (n - size - k + x)
tot=x×(k−x)+(size−x)×(n−size−k+x)
有了这个突破口就可以思考怎么dp了
首先要明白每条边必定会对最终的答案做出贡献,固我们可以这样来定义状态:
d
p
[
u
]
[
i
]
dp[u][i]
dp[u][i]表示节点u的子树选i个黑点的最大贡献,由树形背包模型(对应博客点这里)可以得到方程,不难得出状态方程这样写
d
p
[
u
]
[
i
]
=
m
a
x
{
d
p
[
s
o
n
]
[
j
]
+
d
p
[
u
]
[
i
−
j
]
+
t
o
t
×
w
}
dp[u][i] = max\{ dp[son][j] + dp[u][i - j] + tot \times w \}
dp[u][i]=max{dp[son][j]+dp[u][i−j]+tot×w}
值得注意的点:
i
−
j
i - j
i−j可能并没有这个状态,即可能这颗树在当前转移之前并没有
i
−
j
i - j
i−j个节点,有一种解决方式就是将dp值初始化为-1,若在转移时dp值变了就证明他是合法的,否则并不合法
但是这种转移经过讨论好像他的复杂度接近
O
(
n
3
)
O(n^3)
O(n3)
还有一种的转移方式就是
d
p
[
u
]
[
i
+
j
]
=
m
a
x
{
d
p
[
s
o
n
]
[
i
]
+
d
p
[
u
]
[
j
]
+
t
o
t
×
w
}
dp[u][i + j] = max\{ dp[son][i] + dp[u][j] + tot \times w\}
dp[u][i+j]=max{dp[son][i]+dp[u][j]+tot×w}