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 所在的行和列刪除後剩下...