507.+Jill+Rides+Again


 * Suma del Intervalo Máximo**

Creo que la mejor forma de entender este algoritmo, es resolviendo un problema, por ejemplo el **[|507. Jill Rides again (UVA)]**

__**Puntos clave**__:
 * no hay valores de cero,
 * escoger el segmento máximo (maximally nice) con el tramo más largo en bicicleta y
 * si hay tramos con la misma longitud, elegir el segmento que inicie en la parada más próxima (en Si, el i más pequeño)

Aplicar el algorimto Maximum Interval Sum, modificando las condiciones para el desempate en la selección del tramo máximo.

Maximum Interval Sum Utilizamos un arreglo Sum[], donde inicialmente Sum[i] = Input[i]. code Start := 0 Sum[i] := SumaIntervalo (Start, i); Si Sum[i] < 0 //no tiene caso extender la suma, iniciamos un nuevo intervalo Start = i + 1;
 * Entrada**: conjunto de números en un arreglo Input
 * Salida**: Valor con la suma máxima de números consecuentes en un intervalo [i,j].

//programación dinámica en acción SumaIntervalo (inicio, fin) begin Si (fin = Start) regresa Input[fin]; regresa Input[fin] + Sum[fin -1]; end

code La idea es evitarnos sumar una y otra vez un intervalo, cuando un nuevo número es agregado a este. En lugar de eso mantenemos en memoria la suma actual //Sum[fin-1]// y solo se suma el nuevo número //Input[fin]// para completar la operación.

Entonces, la solución se reduce a realizar un barrido lineal a traves de la lista de números, aplicar el algoritmo y verificar las condiciones de desempate que plantea el problema.

Ejemplos:

code Niceness: -1 6 Sum    : -1 6 ^         max sum

Niceness: 4 -5 4 -3  4  4 -4  4 -5 Sum    : 4 -1  4  1  5  9  5  9  4 ^                ^            stop            max sum

Niceness: -2 -3 -4 Sum    : -2 -3 -4 ^       max sum, but negative... no nice parts

code fuente: [|Methods to Solve (NUS)]