0081 两方向路径和
* * * *
拉格朗日计划
* * * *
两方向路径和

在如下的$5 \times 5$矩阵中,从左上方到右下方且始终只向右或向下移动的最小路径和为2427,该路径已标注为红色。 $$ \begin{pmatrix} \color{red}{131} & 673 & 234 & 103 & 18\\ \color{red}{201} & \color{red}{96} & \color{red}{342} & 965 & 150\\ 630 & 803 & \color{red}{746} & \color{red}{422} & 111\\ 537 & 699 & 497 & \color{red}{121} & 956\\ 805 & 732 & 524 & \color{red}{37} & \color{red}{331} \end{pmatrix} $$ 在文件matrix.txt中包含了一个$80 \times 80$的矩阵,求从该矩阵的左上方到右下方且始终只向右或向下移动的最小路径和。

本题难度:



解答

第18题第67题类似,这是个简单的动态规划问题。

记$a_{i,j}$为矩阵中第i行第j列(从0开始计数)的元素,并令$b_{i,j}$为从矩阵左上方到$a_{i,j}$处的最小路径和,则有 $$b_{i,j}=min(b_{i-1,j},b_{i,j-1})+a_{i,j},\quad i,j>0$$ 以及边界条件 $$b_{0,j}=b_{0,j-1}+a_{0,j}, \quad b_{i,0}=b_{i-1,0}+a_{i,0}, \quad b_{0,0}=a_{0,0}.$$ 递推即得结果$427337$。

a=[]

with open("081_matrix.txt") as f:
    for line in f:
        a.append([int(i) for i in line.split(",")])


b=[[0 for j in range(80)] for i in range(80)]
b[0][0]=a[0][0]
for i in range(1,80):
    b[0][i]=b[0][i-1]+a[0][i]
    b[i][0]=b[i-1][0]+a[i][0]
for i in range(1,80):
    for j in range(1,80):
        b[i][j]=min(b[i-1][j],b[i][j-1])+a[i][j]
print b[-1][-1]