最大子列和問題 MaxSubseqSum

2021-09-28 19:38:58 字數 2651 閱讀 8296

個人覺得解法1最先想到,再仔細觀察是解法2

解法3不好想到,但理解起來不算太難;解法4是真的不好理解(本人對遞迴理解較弱)

def

maxsubseqsum

(seq)

: n=

len(seq)

maxsum =

0for i in

range

(n):

for j in

range

(i,n)

: thissum =

0for k in

range

(i,j+1)

: thissum += seq[k]

if thissum > maxsum:

maxsum = thissum

return maxsum

這是最為直觀的求解方式,但時間複雜度為o(n*3)

相當於每一次重複加上i,j的元素

def

maxsubseqsum2

(seq)

: n=

len(seq)

maxsum =

0for i in

range

(n):

thissum =

0for j in

range

(i,n)

: thissum += seq[j]

if thissum>maxsum:

maxsum = thissum

return maxsum

每次要算一遍子列和,對與這一次的子列和就等於上一次的子列和再加乙個

def

maxsubseqsum3

(seq)

: n=

len(seq)

thissum = maxsum =

0for i in

range

(n):

thissum+=seq[i]

if thissum >maxsum:

maxsum = thissum

elif thissum<0:

thissum =

0return maxsum

當前的子列和如果是負的,那麼就把它置0,因為乙個負數只能讓和減小,於是就從0開始加起,相當於丟掉那個數

在任何乙個地方終止輸入,都能對當前輸出正確結果

def

divideandconquer

(subseq,left,right)

:if left == right :

# 若subseq只有乙個數,遞迴終止

if subseq[left]

>0:

# 這裡當這個數大於0是,算上這個乙個數的subseq的最大

return subseq[left]

# 如果是負數,則預設sum以0開始加和,則丟掉這個數

else

:return

0 center =

(left +right)//2

maxleftsum = divideandconquer(subseq,left,center)

maxrightsum = divideandconquer(subseq,center+

1,right)

maxleftbordersum = leftbordersum =

0for i in

range

(center,left-1,

-1):

# 從中線向左掃瞄

leftbordersum += subseq[i]

if leftbordersum>maxleftbordersum:

maxleftbordersum = leftbordersum

maxrightbordersum = rightbordersum =

0for i in

range

(center+

1,right+1)

:# 從中線向右掃瞄

rightbordersum += subseq[i]

if rightbordersum > maxrightbordersum:

maxrightbordersum = rightbordersum

return

max(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum)

defmaxsubseqsum4

(seq)

: n =

len(seq)

return divideandconquer(seq,

0,n-

1)

分而治之

把陣列一分為二,找到左邊的,再找到右邊的,最後再找到跨越邊界的

遞迴結束判斷還是有點懵,求大神指教

最大子列和問題

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入格式 輸入第1行給出正整數 k 100000 第2行給出k個整數,其間以空格分隔。輸出格式...

最大子列和問題

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入格式 輸入第1行給出正整數 k 100000 第2行給出k個整數,其間以空格分隔。輸出格式...

最大子列和問題

給出乙個序列,求出最大子列和。演算法一 long maxsum int a,int n return maxsum 這是乙個窮舉的演算法,有三個巢狀的for迴圈,時間複雜度為o n 3 在計算的時候有很多不必要的重複項,例如當i 0,j 3時,和的計算為 a 1 a 2 a 3 當i 0,j 4時,...