leetcode-MinimumPathSum

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

Minimum Path Sum题意:

给定一个方格,每个格子中有一个数字,现在我们要找一条从方格左上角出发直到方格右下角的路,条件是这条路经过的数字之和为最小。

解题思路:

此题仍然是动态规划类型的问题,关键是我们如何将这个问题划分为多个类似阶段。

目前的想法是可不可以先找到小方格内的最小路径,然后在去利用当前的结果去找比他大的方格的最小路径。如果是这样的话,大方格的最小路径一定会路过小方格最小路径吗?(一定会到达小方格的左上角吗?)这一点还不能确定。

从刚才的想法我衍生出来另一种方法,首先我们观察我们每一步影响到的方块数,我们会发现随着路径长度的增加,我们是以阶梯形状向上推进的(假设我们从右下方往左上方找)。像这样:

OOOOOOOOXOXXXXX

OOO>OOX>OXX>XXX>XXX

OOXOXXXXXXXXXXX

依照动态规划的思想,在每个阶段,我们可以将打叉的区域的方格数字标记为从右下角出发到达当前方格的最短路径长度。层层递增,那么有当前

matrix[i][j] = min(matrix[i-1][j], matrix[i][j-1])

假设我们有一个矩阵如下:

S50

160

43E

那么首先我们先更新矩阵右下角两条边的最短路径,然后在依次往上更新矩阵:

S50S50S50(S+5)50

160>190>890>890

73E73E73E73E

于是程序我们就可写成:

class Solution:

# @param {integer[][]} grid

# @return {integer}

def minPathSum(self, grid):

m = len(grid)

n = len(grid[0])

for i in range(1,m):

grid[i][0] += grid[i-1][0]

for j in range(1,n):

grid[0][j] += grid[0][j-1]

for i in range(1,m):

for j in range(1,n):

grid[i][j] += min(grid[i-1][j], grid[i][j-1])

return grid[-1][-1]

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航