P7359 「JZOI-1」旅行
暴力 DP 是容易的,复杂度 \(O(n^2)\)。想要优化,因为是无根树,我们就得开两个 DP 数组,一个记录他到他爸,一个记录他爸到他的答案。
我们现在的诉求是快速求出树上一段路径的 DP 值。可以尝试倍增或树剖套广义矩阵乘法。广义矩阵乘法应该是动态 DP 里面要用的,所以这题也算半个动态 DP。
广义矩阵乘法公式为:
\[C_{i,j}=\min\{A_{i,k}+B_{k,j}\} \]实际上就是把原 \(\sum\) 改为 \(\min\)、原 \(\times\) 改为 \(+\)。
考虑如何构建矩阵。写出转移方程:
\[\begin{aligned}f_{u,0}&\gets\min(f_{v,0},f_{v,1})+a_v\\f_{u,1}&\gets\min(f_{v,0}+L,f_{v,1})+a_v\pm z_v\end{aligned}
\]
所以矩阵就长这样:
\[\begin{bmatrix}f_{u,0}&f_{u,1}\end{bmatrix}=\begin{bmatrix}f_{v,0}&f_{v,1}\end{bmatrix}\times\begin{bmatrix}
a_v&a_v\pm z_v+L\\
a_v&a_v\pm z_v
\end{bmatrix}
\]
手模一下。然后倍增就正常预处理,注意乘法顺序。