p =[30
,35,15
,5,10
,20,25
]def
function
(p):
n =len(p)-1
m =[[
0]*(n+1)
for i in
range
(n+1)]
#動態規劃最優乘法次數記錄表
s =[[
0]*(n+1)
for i in
range
(n+1)]
#矩陣劃分位置記錄表
for r in
range(1
,n):
#對角線垂直方向遍歷
for i in
range(1
,n):
#第r個對角線上位置進行遍歷
j = i + r
if j > n:
#該條對角線遍歷結束
break
m[i]
[j]= m[i]
[i]+ m[i+1]
[j]+ p[i-1]
*p[i]
*p[j]
s[i]
[j]= i
for k in
range
(i+1
,j):
temp = m[i]
[k]+ m[k+1]
[j]+ p[i-1]
*p[k]
*p[j]
if m[i]
[j]> temp:
m[i]
[j]= temp
s[i]
[j]= k
print
('m:'
)for i in
range(1
,n+1):
for j in
range(1
,n+1):
print
(m[i]
[j],end=
' ')
print()
print
('s:'
)for i in
range(1
,n+1):
for j in
range(1
,n+1):
print
(s[i]
[j],end=
' ')
print()
return s
s = function(p)
deftraceback
(i,j,s)
:#輸出計算順序
if i == j:
return
traceback(i,s[i]
[j],s)
traceback(s[i]
[j]+
1,j,s)
print
('multiply a'
,i,':'
,s[i]
[j],
'and a'
,s[i]
[j]+1,
':',j)
traceback(1,
6,s)
"""m:
0 15750 7875 9375 11875 15125
0 0 2625 4375 7125 10500
0 0 0 750 2500 5375
0 0 0 0 1000 3500
0 0 0 0 0 5000
0 0 0 0 0 0
s:0 1 1 3 3 3
0 0 2 3 3 3
0 0 0 3 3 3
0 0 0 0 4 5
0 0 0 0 0 5
0 0 0 0 0 0
multiply a 2 : 2 and a 3 : 3
multiply a 1 : 1 and a 2 : 3
multiply a 4 : 4 and a 5 : 5
multiply a 4 : 5 and a 6 : 6
multiply a 1 : 3 and a 4 : 6
"""
小黑演算法成長日記23 堆排序
arr 2,5,4,2,1,22,4,5,3,87,3,22 def adjustheap arr,length,i 調整新新增arr i 元素後,繼續調整為大根堆 temp arr i 將arr i 存入temp k 2 i 1 從孩子中進行搜尋 while k length if k 1 len...
小黑演算法成長日記7 凸多邊形最優剖分
三角形權值之和並非是邊和弦之和,在這裡坑了我兩個小時。path 0,2,2,3,1,4 2,0,1,5,2,3 2,1,0,2,1,4 3,5,2,0,6,2 1,2,1,6,0,1 4,3,4,2,1,0 鄰接矩陣 defw a,b,c 劃分子多邊形的三角形權值 return path a b p...
小黑演算法成長日記5 最大段和問題及其推廣
1.簡單暴力窮舉法 窮舉法 defmaxsum arr n len arr max 0 besti 1 bestj 1 for i in range n 遍歷序列開頭指標 sum 0for j in range i,n 遍歷序列結尾指標 sum arr j ifsum max max sum bes...