Tenemos un arreglo de enteros llamado A
. Un subarreglo es un bloque de elementos consecutivos de elementos de A
.
Por ejemplo, si A = [-3, 5, -1, 2]
, estos son algunos de sus subarreglos:
[-3]
[5, -1]
[-3, 5, -1, 2]
Decimos que la suma de un subarreglo es la suma de todos sus elementos.
Escribe un programa que encuentre el subarreglo de A
cuya suma sea lo más
grande posible.
En nuestro ejemplo, la respuesta es el subarreglo [5, -1, 2]
que tiene suma
6
. Todos los demás subarreglos tiene una suma menor:
La entrada contiene varias líneas:
N
, el número de elementos en el arreglo.N
enteros Ai
para 0 ≤ i
< N
, los elementos del arreglo. Estos números están separados por espacios. Está garantizado que Ai
satisface -109 ≤ Ai
≤ 109.La salida debe tener una única línea con un entero, la máxima suma posible
entre todos los subarreglos de A
.
Sólo debes considerar subarreglos que tienen por lo menos un elemento (en otras palabras, no es válido considerar un subarreglo vacío).
4
-3 5 -1 2
6
Este es el ejemplo del principio. [5, -1, 2]
es el subarreglo de
máxima suma y su suma es 6
. Cualquier otro subarreglo tiene suma menor a 6
.
4
-1 -3 -2 -4
-1
Cuando todos los elementos son negativos, no vale la pena agarrar 2 o más elementos. Entonces la respuesta es un subarreglo con un único elemento, el elemento menos negativo de todos.
3
0 0 0
0
Cuando todos los elementos son 0
, todos los subarreglos tienen suma 0
.
3
10 -1 10
19
La mejor respuesta es agarrar todos los elementos. Vale la pena incluir el -1
porque nos permite agarrar los dos dieces y maximizar la suma.
3
10 -100 10
10
Ahora no vale la pena incluir el elemento negativo del medio, porque es demasiado negativo.
1 ≤ N ≤ 80,000
.Este problema tiene varias soluciones con varias complejidades: O(n2)
,
O(n log n)
y por lo menos dos soluciones O(n)
diferentes. ¿Puedes encontrarlas todas?