矩陣的最小路徑和

2021-08-04 10:17:58 字數 1653 閱讀 8797

給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。

方法一:遞迴

#coding=utf-8

defsolution

(m,l):

n=l+=m[0][0]

if len(m)==1

and len(m[0])==1:

return l

if len(m)==1

and len(m[0])>1:

ans=solution(n,l)

return ans

if len(m)>1

and len(m[0])==1:

ans=solution(m[1:],l)

return ans

for i in range(len(m)):

ans=min(solution(m[1:],l),solution(n,l))

return ans

方法二:動態規劃 複雜度o(m*n)

dp[i][j]表示從左上角(0,0)位置走到(i,j)位置的最小路徑和,dp的第一行和第一列可以直接初始化,因為第一行只能從左邊走過來,第一列只能從上面走過來。

#coding=utf-8

defsolution

(m):

dp=[[0

for i in range(len(m[0]))] for j in range(len(m))]

dp[0][0]=m[0][0]

for i in range(1,len(m[0])):

dp[0][i]=dp[0][i-1]+m[0][i]

for i in range(1,len(m)):

dp[i][0]=dp[i-1][0]+m[i][0]

for i in range(1,len(m)):

for j in range(1,len(m[0])):

dp[i][j]=min(dp[i][j-1],dp[i-1][j])+m[i][j]

return dp[len(m)-1][len(m[0])-1]

方法三:動態規劃空間壓縮

只用乙個行陣列arr記錄第一行、第二行…一次計算。直到最後一行,得到arr[n-1]就是左上角到右下角的最小路徑和。初始化,第一次arr的值為dp[0][i],之後先變arr[0]=arr[0]+m[i][0],再繼續向後面。

#coding=utf-8

defsolution

(m):

dp=[0

for i in range(len(m[0]))]

dp[0]=m[0][0]

for i in range(1,len(m[0])):

dp[i]=m[0][i]+dp[i-1]

for i in range(1,len(m)):

dp[0]=dp[0]+m[i][0]

for j in range(1,len(dp)):

dp[j]=m[i][j]+min(dp[j-1],dp[j])

return dp[-1]

矩陣的最小路徑和

準備校招的!這些是一本書的筆記 程式設計師 面試指南 it名企演算法與資料結構題目最優解 左程雲 給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和 舉例 如果給定的m如下 135 9 813 4 506 1 8...

矩陣的最小路徑和

題目 給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後達到右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。舉例 給定的m如下 1 3 5 9 8 1 3 4 5 0 6 1 8 8 4 0 路徑1,3,1,0,6,1,0是所有路徑中路徑和最小的,所以返回12。...

矩陣的最小路徑和

給定乙個矩陣matrix,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中的最小路徑和。如果給定的矩陣matrix如下 其中路徑1,3,1,0,6,1,0是所有路徑中路徑和最小的,所以返回12。下面我們使用遞迴的方法來處理這個問題。假設現...