语言:python
思路:1.检验矩阵大小,若n>m,则转置该矩阵(便于后续计算)即matrix = matrixT
2.建立一个代价矩阵,其大小与matrix相等,每个格子的值将代表从该格子出发到终点的最小路径(代价)
3.先从终点开始走,计算包围终点的方格(最内层蓝色方格)的最小代价,计算顺序见标号。
先计算上边的,在计算左边的,这样的话每个方格在计算自身最小路径值时,到终点的最短路径值都是已知的 比如已经计算了1,2,方格,计算3方格时,由于只能向下或向右走,而3方格右边和下边的方格代价是已知的, 3只要选择最小的方向(1或者2)就可以使得到终点的路径最小
4.当遍历完n x n矩阵时再遍历左侧多余的方格,遍历方向是向上
5.当计算完代价矩阵时,代价矩阵的起始点即是到终点的最短路径代价
def revermat(data,n,m): remat = [[0 for i in range(n)]for j in range(m)] for i in range(n): for j in range(m): remat[j][i] = data[i][j] return remat class Solution: def minPathSum(self , matrix ): n = len(matrix) m = len(matrix[0]) if n>m: matrix = revermat(matrix, n, m) temp = n n = m m = temp data2 = [[0 for i in range(m)]for j in range(n)] data2[n-1][m-1] = matrix[n-1][m-1] for i in range(1,n,1): for c in range(m-1,m-i-1,-1): if c == m-1: data2[n-1-i][c] = matrix[n-1-i][c]+data2[n-i][c] else: data2[n-1-i][c] = min(data2[n-1-i][c+1],data2[n-i][c])+matrix[n-1-i][c] for r in range(n-1,n-i-2,-1): if r == n-1: data2[r][m-i-1] = matrix[r][m-i-1]+data2[r][m-i] else: data2[r][m-i-1] = min(data2[r+1][m-i-1],data2[r][m-i])+matrix[r][m-i-1] for j in range(m-n-1,-1,-1): for r in range(n-1,-1,-1): if r == n-1: data2[r][j] = matrix[r][j] + data2[r][j+1] else: data2[r][j] = min(data2[r+1][j],data2[r][j+1])+matrix[r][j] return data2[0][0]