网格图分治模型

若网格图面积为 \(S\),取短边分治,令分治层的复杂度和短边相关(一般是从短边上每个点出发对整个网格图 DP/搜索 之类的)。

因为短边长度 \(O(\sqrt S)\)(一般)一层复杂度是 \(O(S\sqrt S)\),总复杂度 \(T(S)=2T(S/2)+O(S\sqrt S)=O(S\sqrt S)=O(n^3)\)

另外二维 DP 经常转化为网格图最短路做。常常和决策单调性连在一起。

例一:P6976

多次查询最短路,我们联想到网格图最短路的分治模型。

  • 如果行数(或者对称的列数)比较小,可以直接对列分治,从分界列上每个点为起点跑最短路,然后计算跨过分界列的查询。

  • 如果行列个数大概同阶,就选小的那边分治,同理计算。

以上两种做法都是沿用了一个思路:取一个不大的点集,让它们构成图的割集。从这个点集里每个点作为起点都跑一次最短路,用 "经过它们的最短路" 来更新答案,再递归入割开的每个块里继续处理。

有了这个想法本题就比较简单了。考虑取什么割集,比较好想到只要取一条对角线,然后从两个端点出发跑最短路,再递归进对角线两半就行了。那问题在于取什么对角线,如果取的对角线分出的两半大小很不均匀就炸了。

然后考虑取什么对角线是比较均匀的。一个自然的想法是找到圆心,取圆心所在三角形的三条边里划分最均匀的那条。

事实上这是对的,因为这三条边划分出来较大的部分一定是圆心所在部分,而较小的那部分都不相交,所以三个较小的部分里大小最大的一定超过 \(n/3\)。因此一次递归会划分为 \(1/3\)\(2/3\) 两个部分,一共 \(\log\) 层到底。

因为是没有边权的,所以求最短路 bfs 即可,复杂度 \(O((n+q)\log n)\)

注意如果有边权的话,就算起点终点位于同一边,但仍然可能存在起点跨过分界线再回来的最短路。


另外一种观察角度是注意到这个东西是个平面图,平面图那就自然考虑对偶图。然后发现对偶图上是若干个三角形作为点的。

手玩一下可以得出结论:对偶图是一棵树,且每个点的度数 \(\le 3\)。然后在对偶图上做边分治即可,就是和上面一样的过程。


例二:Desant 2

我怎么没写题解。不过我记得洛谷题解区一个有图的题解写得挺好的。


例三:给定两个字符串,求最小编辑距离使得它们是轮换相等的。

  1. 二维 DP 转移方程,有明显顺序关系且有至少一维变化不大的,可以考虑转化为网格图模型(广义网格图:一条线段上某个点走到下一条线段上某个点)。

    本题是基本的网格图模型。广义网格图模型可以看【无题号 函数最小和】。

  2. 对于循环题,永远都要考虑破环为链。就算这个 "环" 是圆柱,那也考虑变成长方形。

  3. 网格图最短路一定要记得考虑分治 + 决策单调性。

普通编辑距离的 DP 方程:

\[dp_{i,j}=\min(dp_{i-1,j-1}+[s_i=t_j],dp_{i-1,j}+1,dp_{i,j-1}+1) \]

然后发现这个东西可以转化为网格图最短路(不过比横纵还多了对角线可以走)。普通编辑距离的答案就是 \((0,0)\rightarrow (n,m)\) 的最短路。

那环形编辑距离呢?考虑破环为链,把网格图扩大到 \(n\times 2m\)。答案就是 \((0,0)\rightarrow (n,m),(0,1)\rightarrow (n,m+1),\dots,(0,m-1)\rightarrow(n,2m-1)\)

那么我们考虑求出第 \(0\) 行每个点到第 \(n\) 行每个点的最短路。

网格图最短路,考虑分治 + 决策单调性,确实存在。那么分治,每次分别取上下部分的中点,在当前的决策范围内暴力 DP 并找出最优的路径,再向两边递归(注意这条路径把两边的决策范围又分开了)。

复杂度 \(O(n^2\log n)\)。考虑分治树,每个格点只会贡献 \(\log n\) 次复杂度。

posted @ 2025-11-25 22:32  FLY_lai  阅读(16)  评论(0)    收藏  举报