給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。
方法一:遞迴
方法二:動態規劃 複雜度o(m*n)#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
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。下面我們使用遞迴的方法來處理這個問題。假設現...