算法题:矩阵的最小路径和
最近在看左程云的《程序员代码面试指南》,感觉不错,题都分了类,很方便有目的的刷题,书里的代码都是java实现的,刚好最近在学习python,就用python去练习一下。
1. 问题描述
给定一个矩阵map, 从左上角开始,每次向下或想有移动,最后抵达右下角位置,路径和就是路径上数字的累加。返回所有路径中最小路径和。
举例
给定map:
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
路径1,3,1,0,6,1,0是最小的路径,返回12
2. 解决方法
典型的简单动态规划问题,创建矩阵m,大小等于map,m[i][j]表示到达map[i][j]的最短路径和,由于只能向下或向右,所以m[i][j]等于m[i-1][j] + map[i][j]和m[i][j-1] + map[i][j],也就是从上面或者左面最小的地方过来, 加上自己的代价。
3. 代码实现
def minPath(map):
# 创建m
m = [[0 for i in range(len(map[0]))] for i in range(len(map))]
for i in range(len(map[0])):
if i == 0:
m[0][i] = map[0][i]
else:
m[0][i] = map[0][i] + m[0][i-1]
# 进行初始化
for i in range(len(map)):
if i == 0:
m[i][0] = map[i][0]
else:
m[i][0] = map[i][0] + m[i-1][0]
# 求解
for i in range(1, len(map)):
for j in range(1, len(map[0])):
m[i][j] = min(m[i-1][j] + map[i][j], m[i][j-1] + map[i][j])
return m
if __name__ == "__main__":
map = [[1, 3, 5, 9], [8, 1, 3, 4], [5, 0, 6, 1], [8, 8, 4, 0]]
m = minPath(map)
for item in m:
for i in item:
print(i, end='\t')
print()
###### 程序运行结果
1 4 9 18
9 5 8 12
14 5 11 12
22 13 15 12