1. 动态规划与路径问题概述
动态规划(Dynamic Programming)作为算法竞赛中的核心思想,在解决路径类问题时展现出独特优势。我第一次接触路径DP是在大二校赛的一道迷宫题目上,当时用DFS暴力搜索直接超时,后来学长指点用动态规划优化,运行时间从2秒降到了15毫秒,这种性能飞跃让我彻底迷上了这个算法。
路径DP本质上是动态规划在网格或图结构中的特殊应用,它通过将问题分解为相互关联的子问题,避免重复计算,从而大幅提升效率。与常规动态规划相比,路径问题通常具有明确的二维状态表示(如坐标位置),这使得状态转移更加直观。
关键认知:路径DP不是某种特定算法,而是一类问题的解决范式。其核心在于发现路径之间的重叠子问题并建立状态转移关系。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 路径DP的核心要素解析
2.1 状态定义的艺术
在网格路径问题中,最基础的状态定义是dp[i][j]表示到达(i,j)位置的某种属性(如最小代价、最大收益等)。但高手往往会根据问题特性进行创新:
-
经典案例:LeetCode 64最小路径和
python复制# 基础状态定义 dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j] # 优化版本(滚动数组) dp[j] = min(dp[j], dp[j-1]) + grid[i][j] -
进阶变形:当路径需要考虑额外维度时(如剩余步数、携带物品等),状态需要升维:
python复制# 带限制条件的路径问题 dp[i][j][k] # k表示已获得的宝物数量或剩余能量值
2.2 状态转移方程的构建技巧
状态转移是路径DP的灵魂,我总结出三个验证法则:
- 完备性:必须覆盖所有可能的转移来源
- 无后效性:当前状态只依赖已计算的状态
- 边界处理:明确起点和边缘位置的特殊情况
以NOIP经典题《过河卒》为例:
python复制# 马控制点需要特殊标记
if (i,j) not under_horse_attack:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
else:
dp[i][j] = 0
2.3 初始化与边界处理的陷阱
新手最
