Domine o Subarray de Soma Máxima com o Algoritmo de Dividir & Conquistar
Existem muitas formas de encontrar a subarray de soma máxima em um conjunto de n inteiros. Uma dessas maneiras utiliza o algoritmo de dividir & conquistar. Para resolver esse problema, é preciso dividir o array recursivamente em 2 partes, identificar a subarray de soma máxima na parte esquerda, na parte direita e na parte que cruza o ponto médio em cada uma dessas divisões, e então combinar esses resultados para obter a resposta do array original.
O pseudocódigo do algoritmo pode ser o seguinte:
def max_subarray(a):
# Casos base
if len(a) == 0:
return float('-inf'), float('-inf'), float('-inf')
if len(a) == 1:
return a[0], a[0], a[0]
# Dividir (obter as respostas para as partes esquerda e direita)
ll, lmax, lr = max_subarray(a[:len(a) // 2])
rl, rmax, rr = max_subarray(a[len(a) // 2:])
lsum = sum(a[:len(a) // 2])
rsum = sum(a[len(a) // 2:])
# Obter 3 valores e retornar o prefixo máximo, o sufixo máximo e a soma máxima total
return conquer(ll, lmax, lr, lsum, rl, rmax, rr, rsum)
Neste problema, você é convidado a implementar a parte conquer, na qual, dados 8 números, deverá identificar corretamente os 3 valores que representam o melhor prefixo (prefix-sum), a melhor soma que cruza o ponto médio e o melhor sufixo (suffix-sum). Os 8 valores que são fornecidos são:
O melhor prefix sum do subarray esquerdo
A soma máxima do subarray esquerdo
O melhor suffix sum do subarray esquerdo
A soma total dos elementos do subarray esquerdo
O melhor prefix sum do subarray direito
A soma máxima do subarray direito
O melhor suffix sum do subarray direito
A soma total dos elementos do subarray direito
Entrada
A única linha da entrada contém 8 inteiros na ordem descrita acima. Cada inteiro não excede em valor absoluto.
Saída
O programa deve imprimir 3 números - o melhor prefix sum, a melhor soma que cruza o ponto médio e o melhor suffix sum.