個人覺得解法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時,...