leecode 每日解题思路 64 Minimum Path Sum

题目描述:spa

题目连接:64 Minimum Path Sumcode

  问题是要求在一个全为正整数的 m X n 的矩阵中, 取一条从左上为起点, 走到右下为重点的路径, (前进方向只能向左或者向右),求一条所通过元素和最小的一条路径。blog

其实,题目已经给出了提示:, 动态规划应该是最直接的解法之一。leetcode

 

 

  这边咱们了解到, 问题中只容许走到的每一个点右移或者下移,这就意味着从起点开始, 都有两种后继路径(最后一行和最后一列除外),以此类推, 获得全部路径,而后取其中路径和虽小的值,就能够获得结果了。 可是!咱们仔细想一想,若是这么求解问题的话, 对于一个N X N 的矩阵, 他的可能路径条数有几条?(想一想N层的二叉树的路径有几条)因此用这个思路的话, 可行, 可是不推荐,由于数据成长是O(2^N)的, 太可怕。get

  再想一想,前面提到:io

其实就是意味着: 从终点开始往前推, 都有两种前驱路径(第一行和第一列除外),最后一个点只可能从上边走下来,即为path_top或者从左边走过来path_left, 至于走哪条路, 天然是哪一条路径和小,就选择哪一条。class

对于最后一个点1上边路径的最佳结果,已经从上边的红色区域中的带哦并累计到3这个点(另外须要一个路径和矩阵作记录)二叉树

对于最后一个点左边最小路径的结果,已经从左边的红色区域中获得并累积到8这个点(另外须要一个路径和矩阵作记录)im

 

而对于以上红色区域的最后一个点, 也一样是从上层区域和左边区域已经求得的最优解来进行2选一操做, 作成最优解。d3

就像这样:

而后一直重复, 直到起点。

因此,对于(M,N)点处的结果, 必然是从(M-1)*N 矩阵 和 M* (N-1)矩阵中求取的, 

ok, 推理到这一步, 其实问题已经解决了, 全部的问题都是从起点开始, 全部的点都是由以前点上的路径和决定的。

 

从最简单的情形开始:对于一个2*2的举证, [0,0] 决定了[0,1]和[1,0], 

这样[1,1]的最小值确定是从[0,1]的4 和 [1, 0]的7中比较取值, 因此最后的到在终点[1,1]的最小取值4+2 = 6;

咱们定义对于走到每一个点的最小路径和矩阵path_sum[m][n], 以及给出的每一个点上的值矩阵matrix[m][n]

获得: path_sum[i, j] =  min(path_sum[i-1][j], path_sum[i][j-1]) + matrix[m][n]

(注意, 上式中为处理边界是的状况, 只指出此递推式的核心步骤);

说的可能有点乱, 但核心思想就是尽然你每一个非边界的点只能日后两条去路, 那必然非边界的每一个点都确定也只有两条来路, 

最优解就是这两条来路里面2选一, done!

 

下面是我的的solution 代码, 仅供参考

相关文章
相关标签/搜索