求矩陣最少(或最多)路徑和(python實現)

2021-09-29 12:38:22 字數 3674 閱讀 5125

1.遞迴方式

求最短,最終狀態即右下角

f(v, i, j)

=min

(f(v, i -

1, j)

, f(v, i, j -1)

)+ v[i]

[j]

最長只需將min改為max即可

import numpy as np

# i:行

# j:列

# v:矩陣

deff

(v, i, j)

:if i ==

0and j ==0:

return v[0]

[0]elif i ==0:

return f(v, i, j -1)

+ v[i]

[j]elif j ==0:

return f(v, i -

1, j)

+ v[i]

[j]else

:return

min(f(v, i -

1, j)

, f(v, i, j -1)

)+ v[i]

[j]v = np.array([[

1,3,

5,9]

,[8,

1,3,

4],[

5,0,

6,1]

,[8,

8,4,

0]])

print

(f(v,3,3))

2.遞推方式

注意到只能往右或往下,可以想象,每下一層是右方或下方,而矩陣中,可以想象是以平行與對角線方向為一層,一層層從左上角到右下角遞推

即執行一半為如此:

執行完全部為如此

而一層層,每層每一單元取左或上累計最少的數加上本身

f[i]

[j]=

min(f[i -

1]f[j]

, f[i]f[j -1]

)+ v[i]

[j]

因此:**如下:

import numpy as np

# i:行

# j:列

# v:矩陣

deff

(v, n)

: s = np.array([[

0]* n]

* n)

for p in

range

(n):

for i in

range

(p +1)

: j = p - i

if i ==

0and j ==0:

s[0]

[0]= v[0]

[0]elif i ==0:

s[0]

[j]= s[0]

[j -1]

+ v[0]

[j]elif j ==0:

s[i][0

]= s[i -1]

[0]+ v[i][0

]else

: s[i]

[j]=

min(s[i -1]

[j], s[i]

[j -1]

)+ v[i]

[j] limit =

0for p in

range

(n,2

* n -1)

: limit +=

1for i in

range

(limit, p - limit +1)

: j = p - i

if i ==

0and j ==0:

s[0]

[0]= v[0]

[0]elif i ==0:

s[0]

[j]= s[0]

[j -1]

+ v[0]

[j]elif j ==0:

s[i][0

]= s[i -1]

[0]+ v[i][0

]else

: s[i]

[j]=

min(s[i -1]

[j], s[i]

[j -1]

)+ v[i]

[j]return s

v = np.array([[

1,3,

5,9]

,[8,

1,3,

4],[

5,0,

6,1]

,[8,

8,4,

0]])

print

(f(v,4)

)

最後統計出的矩陣的右下即為最少路徑和(s[n-1][n-1])

而通過返回s[n-1],我們可以看到路徑,從左上角開始,取每一層最小值(不可單獨面對方向,可能會陷入陷阱,中途進入錯誤路徑),**實現如下:

def

view

(s, n)

: string =

''for p in

range

(n):

min=

0for i in

range

(p +1)

: j = p - i

ifmin==0:

min= s[i]

[j]elif

min> s[i]

[j]:

min= s[i]

[j] string +=

str(

min)

+'->'

limit =

0for p in

range

(n,2

* n -1)

: limit +=

1min=0

for i in

range

(limit, p - limit +1)

: j = p - i

ifmin==0:

min= s[i]

[j]elif

min> s[i]

[j]:

min= s[i]

[j]if p ==(2

* n -2)

: string +=

str(

min)

else

: string +=

str(

min)

+'->'

return string

原矩陣:

執行效果:

矩陣連乘最少次數

include define max 50 define inf 99999999 int p max 1 矩陣鏈乘 存各矩陣的行數和最後乙個矩陣的列數 int m max max 總矩陣 int s max max 儲存分割點 int n 輸入矩陣的個數 void matrix void prin...

求最少走多少路

fold已經非常的餓了 所以fold決定去他的朋友家蹭飯吃 fold有3個好朋友 anxdada,ciwikun和twh233,他們住在自己的房屋裡.這三位朋友的房屋都可以相互到達.anxdada家到ciwikun家的距離是a,anxdada家到twh233家的距離是b,ciwikun家到twh23...

伴隨矩陣求逆矩陣

在之前的文章 線性代數之矩陣 中已經介紹了一些關於矩陣的基本概念,本篇文章主要就求解逆矩陣進行進一步總結。我們先看例子來直觀的理解什麼是余子式 minor,後邊將都用英文minor,中文的翻譯較亂 這個例子 我們假設矩陣為a 中我們看到a 1,1 的minor就是將a 1,1 所在的行和列刪除後剩下...