深入浅出:动态规划 (DP)
不要被高大上的名字吓到。动态规划本质上就是:记住过去,指导未来。
一秒钟听懂动态规划(1+1比喻)
有人问你:1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = ?
你费力地数了一下,回答:"8"。
接着,那个人在后面又加了一个 + 1,问你:"现在等于几?"
你会毫不犹豫地回答:"9"。
为什么这次你算得这么快?
因为你 记住了 前面的结果是 8,你只需要算 8 + 1 = 9,而不需要从头再数一遍。 这就是动态规划的核心:将大问题拆解为小问题,并把小问题的答案存起来,避免重复计算。
实战演示:网格路径问题 (Unique Paths)
规则:机器人从左上角出发,每次只能 向右 或 向下 走一步。问到达右下角有多少种不同的路径?
进度: 1 / 43
起点1
终点
当前步骤解析
【初始化】机器人在起点 (0, 0),原地不动算作 1 条路径。
// 状态转移方程
dp[0][0] = 1
正在计算
依赖状态
已计算
未计算
1. 定义状态
确定我们要记录的"结果"是什么。我们定义 dp[i][j] 表示:从起点到达格子 (i, j) 的总路径数。
2. 状态转移方程
找出现状和过去的关系。要到当前格子,只能从上面来或从左边来:dp[i][j] = dp[i-1][j] + dp[i][j-1]
3. 边界初始化
最基础、不用算就知道答案的情况。第一行只能一直往右走,第一列只能一直往下走,所以路径数都是 1。