Estoy volviendo a leer el Manual de diseño de algoritmos de Skiena para ponerme al día con algunas cosas que he olvidado desde la escuela, y estoy un poco desconcertado por sus descripciones de Programación Dinámica. Lo busqué en Wikipedia y en otros sitios, y si bien todas las descripciones tienen sentido, tengo problemas para resolver problemas específicos por mi cuenta. Actualmente, estoy trabajando en el problema 3-5 del libro de Skiena. (Dada una matriz de n números reales, encuentre la suma máxima en cualquier subvector contiguo de la entrada.) Tengo una solución O (n^2), tal como se describe en this answer. Pero estoy atrapado en la solución O (N) usando programación dinámica. No está claro para mí cuál debe ser la relación de recurrencia.¿Cómo puedo encontrar la suma máxima de una subsecuencia usando la programación dinámica?
veo que las subsecuencias forman un conjunto de sumas, así:
S = {a, b, c, d}
a a+b a+b+c a+b+c+d
b b+c b+c+d
c c+d
d
Lo que no entiendo es cómo elegir cuál es el más grande en tiempo lineal. Intenté hacer cosas como realizar un seguimiento de la suma más grande hasta el momento, y si el valor actual es positivo, agréguelo a la suma. Pero cuando tienes secuencias más grandes, esto se vuelve problemático porque puede haber tramos de números negativos que disminuirían la suma, pero un gran número positivo posterior puede hacer que vuelva a ser el máximo.
También me acuerdo de tablas de área sumadas. Puede calcular todas las sumas usando solo las sumas acumulativas: a, a + b, a + b + c, a + b + c + d, etc. (Por ejemplo, si necesita b + c, es simplemente (a + b + c) - (a).) Pero no ve una forma O (N) de obtenerlo.
¿Alguien puede explicarme qué es la solución de programación dinámica O (N) para este problema en particular? Siento que casi lo entiendo, pero me estoy perdiendo algo.
estoy confundido por el gráfico, ya que se salta varias de las subsecuencias (como [5, 15] y [15, -30]). Pero leeré el PDF y veré si tiene más sentido. ¡Gracias! – user1118321
OK, después de leerlo, tiene mucho más sentido ahora. Muchas gracias! – user1118321
El enlace @cMinor está roto. –