小黑演算法成長日記5 最大段和問題及其推廣

2021-10-06 07:29:43 字數 2951 閱讀 1761

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 對角線垂直方...