第一个星期的第一天
准备好好上班了
昨天查上学期的期末成绩
提心吊胆的一科终于是在老师浓浓的师生情下涉险过关了
开心
好好干活了
64-最小路径和
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
这一题也是很典型的动态规划的题目了,还是那句老话,对动态规划算法不熟悉的朋友可以看看我之前写的一篇文章,相信会让你有所熟悉的。
https://blog.csdn.net/weixin_36431280/article/details/86616672
看完这篇文章,你会知道:其实解动态规划算法的核心步骤是找到相应的状态转移方程,而本题的状态转移方程就是下图所示:
转移方程出来了,代码写起来就很简单了。
代码如下:
class Solution:
# 本题采用动态规划的算法
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
if len(grid) == 0:
return 0
grid_row_length, grid_col_length = len(grid), len(grid[0])
# 定义一标记矩阵, 并初始化为全0矩阵
flag_matrix = []
for index in range(grid_row_length):
flag_matrix.append([0]*grid_col_length)
for row in range(grid_row_length):
for col in range(grid_col_length):
# 如果是第一行第一列元素,那么最短路径就是自身
if row == 0 and col == 0:
flag_matrix[row][col] = grid[0][0]
# 如果是第一行非第一列元素,那么最短路径就是从第一个元素到其自身
elif row == 0 and col > 0:
flag_matrix[row][col] = flag_matrix[row][col-1] + grid[row][col]
# 如果是第一列非第一行元素,那么最短路径就是从第一个元素到其自身
elif row > 0 and col == 0:
flag_matrix[row][col] = flag_matrix[row-1][col] + grid[row][col]
# 其他位置的元素所对应的最短路径和就是其上一行元素和其左一列元素所对应的最短路径和的最小值
else:
flag_matrix[row][col] = min(flag_matrix[row-1][col], flag_matrix[row][col-1])+grid[row][col]
return flag_matrix[grid_row_length-1][grid_col_length-1]
if __name__ == "__main__":
grid = [[1, 3, 1], [1, 5, 1], [4, 2, 1]]
min_route = Solution().minPathSum(grid)
print(min_route)
执行效率还算可以,在70%左右