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)