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 besti = i
bestj = j
return max,besti,bestj
arr =[-
2,11,
-4,13
,-5,
-2]max,besti,bestj = maxsum(arr)
print
('窮舉法最大子段和為:'
,max)
print
('對應子段為:'
,(besti,bestj)
)
輸出:
窮舉法最大子段和為: 20
對應子段為: (1, 3)
2.分治法:
# 分治演算法
defmaxsum
(arr,start,end)
:if start == end:
return arr[start]
if arr[start]
>
0else
0 center =
(int)(
(start + end)/2
) leftsum = maxsum(arr,start,center)
#遍歷左段
rightsum = maxsum(arr,center +
1,end)
#遍歷右段
left =
0 temp =
0for i in
range
(center,start-1,
-1):
#從中間向左遍歷
temp += arr[i]
if temp > left:
left = temp
right =
0 temp =
0for i in
range
(center+
1,end+1)
:#從中間向右遍歷
temp += arr[i]
if temp > right:
right = temp
s = left + right
return
max(s,leftsum,rightsum)
#返回當前子段中的最大段
arr =[-
2,11,
-4,13
,-5,
-2]print
('分治演算法計算結果:'
,maxsum(arr,0,
len(arr)-1
))
輸出:
分治演算法計算結果: 20
3.動態規劃
# 動態規劃演算法
defmaxsum
(arr)
: n =
len(arr)
max =
0 p =
0#以arr[i]結尾的最大子段
for i in
range
(n):
if p >0:
#判斷p[i-1]是否大於零,若大於零則p[i] = p[i-1] + arr[i],否則為arr[i]
p += arr[i]
else
: p = arr[i]
if p > max:
max = p
return max
arr =[-
2,11,
-4,13
,-5,
-2]print
('動態規劃演算法:'
,maxsum(arr)
)
輸出:
動態規劃演算法: 20
4.最大子段和推廣:最大子矩陣和
#最大子矩陣之動態規劃
#依次遍歷每一行,求出每一行的向下累加元素陣列p並求出最大子段和。依次求出每一行的陣列p的最大子段和,最後選出最大值
arr =[[
-1,3
,-1]
,[2,
-1,3
],[-
3,1,
2]]def
maxsum2d
(arr)
: m =
len(arr)
n =len(arr[0]
)sum=0
for i in
range
(m):
#依次遍歷每一行
p =[0
]* n #向下累加元素陣列p
for j in
range
(n):
for k in
range
(i,m)
:#向下累計求和
p[j]
+= arr[k]
[j] temp = maxsum(p)
if temp >
sum:
#選出最大值
sum= temp
return
sumprint
('最大子矩陣和:'
,maxsum2d(arr)
)
輸出:
最大子矩陣和: 7
小黑演算法成長日記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...
小黑演算法成長日記6 最大連續m子段和求解
arr 2,11,4,13 5,6,2 def maxsum arr,m n len arr if m n print 輸入引數不合法 return b n 1 0 for i in range m 1 max 0for i in range 1 m 1 對角線長度方向遍歷 for j in ran...
小黑演算法成長日記3 矩陣最優乘法順序
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 對角線垂直方...