浅析:最小路径和

64. 最小路径和

 

今天我们来详细分析一波 最小路径和,带你从头开始一步一步得到最优化的解决方案!

暴力 DFS

首先第一眼看到这个题目,自然而然想到的就是 DFS,遍历出所有的路径,然后得到和最小的路径

关于 DFS 详细的内容可见 回溯 (DFS) 算法框架

很显然,这个是超时的!!!

备忘录 + 递归

上面是没有任何优化的暴力 DFS,可以很明显的看到其实是存在「重叠子问题」

这里采用自顶向下的解法,所以会有一个递归的dp函数,一般来说函数的参数就是状态转移中会变化的量,即:「状态」;函数的返回值就是grid[0..i][0..j]的最小路径和

DP + 递推

明确 base case:显然是当i = 0 and j = 0,最小路径和直接是grid[0][0]

明确「状态」:原问题和子问题中会发生变化的变量。grid[0..i][0..j]会不断地向 base case 靠近,所以唯一的「状态」就是矩阵grid[0..i][0..j]

明确「选择」:导致「状态」产生变化的行为。矩阵grid[0..i][0..j]为什么变化呢?因为在选择不同的方向,每选择一种方向,矩阵就会收缩。所以说「上方 or 左方」就是「选择」(每次都可在选择任意一种方向)

明确 dp 数组/函数的定义:这里采用自底向上的解法,所以会有一个递推的dp数组,一般来说数组的下标就是状态转移中会变化的量,即:「状态」;数组的值就是grid[0..i][0..j]的最小路径和

关于dp[]的初始状态,直接看下图:

1