动态规划算法题:矩阵的最小路径和

算法题:矩阵的最小路径和

最近在看左程云的《程序员代码面试指南》,感觉不错,题都分了类,很方便有目的的刷题,书里的代码都是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
右下角的值即为所求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值