此篇講的是截止時間至 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 ...