1 条题解
-
0
题目概述
名盗 Al Bajtone 要规划从银行到藏身处的逃亡路线,约束条件如下:
- 只能直行或右转(不能左转)
- 不能重复经过同一个交叉口
- 需要避开有警察巡逻的交叉口
- 银行位于最西南交叉口 (1,n) 的南侧,Al 从南向北出发
- 藏身处位于交叉口 (x,y)
城市街道形成 的网格,需要计算所有满足条件的路径数量,结果对 取模。
问题分析
关键约束
- 移动限制:只能直行或右转(即方向变化:北→东→南→西→北)
- 不重复访问:每个交叉口最多经过一次
- 避开警察:标记为
*的交叉口不能经过
路径特性
由于只能右转,路径会形成类似"螺旋"的形状,不断向内收缩。
算法思路
区间动态规划
使用五维DP:
f[leny][x][y][dir]表示:- 当前考虑的矩形区域:从第
x行到第x+lenx-1行,从第y列到第y+leny-1列 - 当前方向
dir:0=上, 1=右, 2=下, 3=左 - 值:从当前矩形区域外进入,按右转规则走完整圈,最终离开的路径数量
状态转移
对于每个矩形区域,考虑四种进入方向:
方向0(从上边界进入):
f[nw][leny][x][y][0] = add(f[nw^1][leny][x+1][y][0], (f[nw][leny-1][x][y+1][1] + d[0]) * (col[xr][y] - col[x-1][y] == 0));- 第一部分:直接穿过上边界继续前进
- 第二部分:在左上角右转,进入右侧子矩形
d[0]:如果左上角是目标点且是唯一路径- 条件:左边界没有警察
方向1(从右边界进入):
f[nw][leny][x][y][1] = add(f[nw][leny-1][x][y][1], (f[nw^1][leny][x+1][y][2] + d[1]) * (hor[x][yr] - hor[x][y-1] == 0));- 第一部分:直接穿过右边界继续前进
- 第二部分:在右上角右转,进入下方子矩形
- 条件:上边界没有警察
其他方向类似。
预处理
hor[i][j]:第 i 行前 j 列的警察数量前缀和col[i][j]:第 j 列前 i 行的警察数量前缀和
用于快速判断某条边界上是否有警察。
算法详解
状态定义
f[leny][x][y][dir]:在矩形[x, x+lenx-1] × [y, y+leny-1]中,从方向dir进入的路径数。其中
lenx隐含在循环中,nw用于滚动数组优化空间。方向编码
- 0: 从上边界进入(向北移动)
- 1: 从右边界进入(向东移动)
- 2: 从下边界进入(向南移动)
- 3: 从左边界进入(向西移动)
转移方程理解
以方向0为例:
- 进入点:上边界的某个点
- 选择1:直行到底,从下边界离开(进入更小的矩形)
- 选择2:在左上角右转,进入右侧子矩形
边界条件
d[0]~d[3]判断当前矩形的四个角是否是目标点:- 如果是目标点且是唯一可达路径,贡献1
- 否则贡献0
样例解析
样例输入
3 5 10 4 2 +++++ ++*++ ++++*- 网格:3行5列
- 目标点:(4,2) - 注意这里的坐标转换
- 模数:10
地图:
行1: +++++ (无警察) 行2: ++*++ (中间有警察) 行3: ++++* (右下角有警察)计算结果
输出2,表示有2条合法路径。
可能的路径(简化描述):
- 北→东→南→西 的某种组合,避开警察
- 另一种右转组合路径
复杂度分析
- 时间复杂度:
- 四重循环:
lenx,leny,x,y - 对于 ,最坏 次操作
- 实际通过滚动数组和优化可接受
- 四重循环:
- 空间复杂度:
- 使用滚动数组优化
算法亮点
- 区间DP:将路径分解为矩形边界上的移动
- 方向处理:通过4个方向状态处理右转约束
- 前缀和优化:快速判断边界是否有警察
- 滚动数组:优化空间复杂度
- 螺旋分解:利用右转特性将路径分解为矩形环
总结
这道题的核心在于将路径规划问题转化为区间DP:
- 问题转化:利用右转约束,路径必然形成矩形环
- 状态设计:用矩形区域+进入方向完整描述状态
- 转移策略:考虑直行或右转两种选择
- 边界处理:用前缀和快速检查警察约束
- 优化技巧:滚动数组降低空间复杂度
这种"区间DP + 方向状态"的方法在解决网格路径计数问题时非常有效,特别是在有移动方向约束的情况下。
- 1
信息
- ID
- 4861
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者