python實現連續子串行最大和問題(動態規劃)

2021-10-03 16:40:40 字數 2117 閱讀 4427

說明:子列表指的是列表中索引(下標)連續的元素構成的列表;列表中的元素是int型別,可能包含正整數、0、負整數;程式輸入列表中的元素,輸出子列表元素求和的最大值,例如:

輸入:1 -2 3 5 -3 2

輸出:8

輸入:0 -2 3 5 -1 2

輸出:9

輸入:-9 -2 -3 -5 -3

輸出:-2

如題,對於原列表a,假設元素a[i]為所求子列表的最後乙個元素,則所求子列表有兩種情況:

1)不含a[i]之前的元素

2)含有a[i]之前的序列(該序列為之前累加得到)

所以求解過程為:對列表中每乙個元素作出上述假設並分別求解兩種情況,並比較記錄最大值。

具體實現如下,時間複雜度o(n),空間複雜度o(1):

def

maxsublist

(items)

: size =

len(items)

_sum = _max = items[0]

for i in

range(1

, size)

:#如果前面序列和的結果小於零 則丟棄(即從兩種情況中取最大值)

_sum =

max(

0, _sum)

_sum += items[i]

#每次累加後記錄最大值

_max =

max(_sum, _max)

return _max

defmain()

: items =

list

(map

(int

,input()

.split())

) result = maxsublist(items)

print

(result)

if __name__ ==

'__main__'

: main(

)

考慮題目給定的序列首尾相連的情況(即構成乙個環狀),此時問題也可分為兩種情況分下:

1)所求子串行不跨過首尾,此時問題就與一開始提出的一致,用上述方法求解即可。

2)所求子串行跨過首尾,即排除掉的序列一定不跨過首尾,通過求解排除掉的序列從而求得結果,此時問題變成情況1)的反問題:」求解子串行的最小和「,用總序列和減去最小序列和即是所求結果。

實現如下:

def

maxsublist

(items)

: size =

len(items)

_sum = _max = items[0]

for i in

range(1

, size)

: _sum =

max(

0, _sum)

_sum += items[i]

_max =

max(_sum, _max)

return _max

defminsublist

(items)

: size =

len(items)

_sum = _min = items[0]

for i in

range(1

, size)

: _sum =

min(

0, _sum)

_sum += items[i]

_min =

min(_sum, _min)

return _min

defmain()

: items =

list

(map

(int

,input()

.split())

) result =

max(maxsublist(items)

,sum

(items)

- minsublist(items)

)print

(result)

if __name__ ==

'__main__'

: main(

)

python實現求解最大連續子串行

def maxsum list max list 0 for i in range 0,len list 子串行開始位置 sum list i for j in range i 1,len list 子串行結束位置 sum list j 子串行求和 if sum max 最大值儲存凌駕於整個子串行迴...

最大連續子串行之和,最大連續子串行乘積

最大連續子串行之和問題描述為 陣列中里有正數也有負數,連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和,求所有子陣列的和的最大值。分析,對陣列a進行一遍掃瞄,sum i 為前i個元素中,包含第i個元素且和最大的連續子陣列,maxsum儲存當前子陣列中最大和,對於a i 1 來說,sum i ...

最大連續子串行

e 最大連續子串行 description 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和 為20。在今年的資料結構考卷中,要求編寫程式得到最大和,現在增加乙個要求,即還需要輸出該 子串行...