Code bij Superieure Streak
De scores:
scores = [6, -7, 5, -3, 8, -6, 9, -4, 7, -5, 4, -8]
Het programma van Mu:
streak = 0 # beste score tot nu toe
for i in range(len(scores)):
# i = begin van periode
for j in range(i, len(scores)):
# j = einde van periode
totaal = sum(scores[i:j+1])
# totaal = som over periode
streak = max(streak, totaal)
Het programma van Milli:
streak = 0 # beste score tot nu toe
teller = 0 # aantal stappen tot nu toe
for i in range(len(scores)):
# i = begin van periode
totaal = 0 # som over periode
for j in range(i, len(scores)):
# j = einde van periode
totaal = totaal + scores[j]
# totaal = som over periode
teller = teller + 1
streak = max(streak, totaal)
Het verbeterde programma van Mu:
def streak_binair(scores, i, j):
"""Bepaal streak en telling voor scores[i:j] met i < j.
"""
if i + 1 == j: # één score
return scores[i], 1
# splits de scores in i:m en m:j
m = (i + j)//2 # midden: i < m < j
s_links, t_links = streak_binair(scores, i, m)
s_rechts, t_rechts = streak_binair(scores, m, j)
teller = t_links + t_rechts
# bepaal beste staart links
totaal = 0 # som scores[k:m]
staart = 0 # score beste staart
for k in range(m - 1, i - 1, -1):
# k = begin van staart
totaal = totaal + scores[k]
staart = max(staart, totaal)
teller = teller + 1
# bepaal beste begin rechts
totaal = 0 # som scores[m:k]
begin = 0 # score beste begin
for k in range(m , j):
# k = einde van begin
totaal = totaal + scores[k]
begin = max(begin, totaal)
teller = teller + 1
mid = staart + begin
return max(s_links, s_rechts, mid), teller
Het verbeterde programma van Milli:
streak, staart = 0, 0
for v in scores
staart = max(0, staart + v)
streak = max(streak, staart)