160326 24 00 最大子串行之和 2

2022-02-16 01:28:38 字數 4481 閱讀 9659

此篇講的是截止時間至 3 月 26 日 24:00 的最大子串行之和 2。相應的題目,可以見王建民老師的部落格中第 2 題:

這是乙個最優化問題,在上一題 dp 的思想下,我們容易想到平凡的 \(o(n^2)\) 的解法。不過,本題也有 \(o(n)\) 的解法,參考:

class subarraysumresult:

def __init__ (self, value, begin, end):

self.value = value

self.begin = begin

self.end = end

def __str__ (self):

return "(%d, %d, %d)" % (self.value, self.begin, self.end)

def kadane (nums):

if not nums:

return none

elif 1 == len (nums):

return subarraysumresult (nums[0], 0, 1)

local_max = subarraysumresult (nums[0], 0, 1)

global_max = subarraysumresult (nums[0], 0, 1)

for i in xrange (1, len (nums)):

if local_max.value > 0:

local_max.value += nums[i]

local_max.end = i + 1

else:

local_max.value = nums[i]

local_max.begin = i

local_max.end = i + 1

if local_max.value > global_max.value:

global_max = subarraysumresult \

(local_max.value, local_max.begin, local_max.end)

return global_max

def maxcircularsum (nums):

if not nums:

return none

elif 1 == len (nums):

return subarraysumresult (nums[0], 0, 1)

max_kadane = kadane (nums)

if max_kadane.value <= 0:

return max_kadane

max_wrap = sum (nums)

nums = [-x for x in nums]

inverse_kadane = kadane (nums)

max_wrap += inverse_kadane.value

if max_wrap > max_kadane.value:

return subarraysumresult \

(max_wrap, inverse_kadane.end - len (nums), inverse_kadane.begin)

else:

return max_kadane

if __name__ == '__main__':

test_cases = [, [0], [0, 0, 0], [1, 1, 1], [1, 2, 3], [-2, -1, -3],

[11, 10, -20, 5, -3, -5, 8, -13, 10],

[11, 10, -20, 5, -3, -5, 8, -13, 10, 11, 10, -20, 5, -3, -5, 8, -13, 10]]

for nums in test_cases:

print "the maxcircularsum of", nums, "is", maxcircularsum (nums)

這次作業滿分 10 分,採取扣分制與體驗分相結合的方式。具體來說:

學號截至上次作業得分小計

160326 24:00

小計20122951300

3020132897335

3820132900

17.5

522.5

20132902

32.5

537.5

20132907382

4020132917

39.5

241.5

20132922

35.5

2.538

20132927

26.5

026.5

20132935

33.5

740.5

20132967

286.5

34.5

20132970

22.5

325.5

20132984

361.5

37.5

20132985331

3420133005

29.5

2.532

20133009

30.5

535.5

20133012

32.5

032.5

20133014190

1920133018220

2220133039325

3720133040281

2920133045299

3820133048

29.5

130.5

20133051

32.5

6.539

20133054

33.5

6.540

20133057

23.5

023.5

20133059270

2720133062

16.5

016.5

20133064

30.5

030.5

20133070310

3120133075320

3220133078368

4420133081

312.5

33.5

20133087304

3420133100

365.5

41.5

20132899103

1320132901

14.5

0.515

20132903

31.5

738.5

20132910

37.5

138.5

20132912

39.5

2.542

20132919

409.5

49.5

20132924

419.5

50.5

20132958384

4220132959

37.5

2.540

20132965

34.5

5.540

20132971

32.5

5.538

20132980

351.5

36.5

20133004340

3420133008

27.5

4.532

20133010113

1420133013278

3520133017

27.5

330.5

20133019351

3620133024

33.5

740.5

20133027

33.5

841.5

20133031

23.5

326.5

20133042

22.5

4.527

2013304350

520133044

4.50

4.520133047161

1720133056

27.5

0.528

20133058

33.5

437.5

20133063

26.5

0.527

20133066

21.5

021.5

20133073

238.5

31.5

20133077

29.5

534.5

20133079

29.5

837.5

20133088

10.5

0.511

20133093

25.5

025.5

20133099210

2120133101

335.5

38.5

歡迎參看下面的文章:

最大子串行

模板 int maxsubsequence const int a,int n return maxsum 複雜度on 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和 為20。在今年的資料...

最大子串行

最大子串行是要找出由數組成的一維陣列中和最大的連續子串行。比如的最大子串行就是 它的和是8,達到最大 而 的最大子串行是,它的和是6。你已經看出來了,找最大子串行的方法很簡單,只要前i項的和還沒有小於0那麼子串行就一直向後擴充套件,否則丟棄之前的子串行開始新的子串行,同時我們要記下各個子串行的和,最...

最大子串行

maxsum最大子串行問題。其實是動態規劃問題,遞推式如下 s 1 a 1 s n s n 1 0?s n 1 a n a n 注意點 暴力是可以解決問題,但是時間肯定會超時。暴力就是把所有子串行都查一遍然後找乙個最大的。如序列為123456,它的所有子串行為 1 2 3 4 5 6 12 123 ...