p8820-solution
P8820 Solution
考虑 \(k=2\),这种情况是不会跳出链的,我们把链拉出来做一个 dp。这个显然可以动态 dp 维护,具体地:
设 \(dp_{i}\) 表示跳到第 \(i\) 个点最小权值和,定义广义矩阵乘法 \(\times\) 满足 \(A\times B=C\) 则
\[C_{i,j}=\min_k\{A_{i,k}+B_{k,j}\}
\]
这个是有结合律的:
\[\begin{aligned}
{((A\times B)\times C)}_{i,j}
&=\min_k\{(A\times B)_{i,k}+C_{k,j}\}\\
&=\min_k\{\min_l\{A_{i,l}+B_{l,k}\}+C_{k,j}\}\\
&=\min_{l,k}\{A_{i,l}+B_{l,k}+C_{k,j}\}\\
\end{aligned}\]
先乘 \(B\times C\) 算出来也是这个的。那么
\[\begin{bmatrix}
dp_{i-1}\quad dp_{i-2}
\end{bmatrix}
\times
\begin{bmatrix}
a_i\quad0\\
a_i\quad \infty
\end{bmatrix}
=
\begin{bmatrix}
dp_{i}\quad dp_{i-1}
\end{bmatrix}
\]
用树剖 / 倍增维护即可。
考虑 \(k=3\):现在可能跳出链了,但只可能跳出链一格。
你发现到自己距离相等的点对后面的跳跃地位是相同,那么我们考虑把距离加入到状态中。
设 \(dp_{i,0}\) 表示跳到第 \(i\) 个点最小权值和,\(dp_{i,1}\) 表示跳到离第 \(i\) 个点距离为 \(1\) 的点最小权值和,\(dp_{i,2}\) 表示跳到离第 \(i\) 个点距离为 \(2\) 的点最小权值和。(要么是第 \(i-2\) 的点,要么是第 \(i-1\) 的点的相邻点)
转移:
\[dp_{i,0}\gets a_i+min\{dp_{i-1,0},dp_{i-1,2}\}
\]
\[dp_{i,1}\gets b_i+min\{dp_{i-1,0},dp_{i-1,1}\}
\]
\[dp_{i,2}\gets dp_{i-1,1}
\]
其中 \(b_i\) 表示 \(i\) 号点所有相邻点的权值最小值。
为什么 \(dp_{i,0}\) 不能从 \(dp_{i-1,1}\) 转移过来?
一方面避免重复一个点跳了两次,一方面这个转移是没有必要的,可以省去上次跳跃取得更优方案。
于是直接维护转移矩阵的积即可。注意起点的转移矩阵要特殊考虑。
\[\begin{bmatrix}
dp_{i-1,0}\quad dp_{i-1,1}\quad dp_{i-1,2}
\end{bmatrix}
\times
\begin{bmatrix}
a_i\quad b_i\quad \infty\\
\infty\quad b_i\quad0\\
a_i\quad \infty\quad\infty
\end{bmatrix}
=
\begin{bmatrix}
dp_{i,0}\quad dp_{i,1}\quad dp_{i,2}
\end{bmatrix}
\]

浙公网安备 33010602011771号