p8820-solution

P8820 Solution

link

考虑 \(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} \]

posted @ 2024-03-04 20:47  iorit  阅读(14)  评论(0)    收藏  举报