8.1. Introducción.

Programación dinámica (DP – Dynamic Programming) es una técnica de programación que se puede utilizar en problemas que presentan las siguientes características: el problema puede ser resuelto de manera óptima si sus partes son resueltas de manera óptima, y para resolver el problema necesitamos recalcular una misma parte en varias ocasiones.

La idea básica de la programación dinámica es guardar los resultados de los subproblemas para no tener que volverlos a calcular después. Con esta simple técnica, podemos transformar algoritmos que corren en tiempo exponencial a tiempo polinomial. Este ahorro en tiempo se refleja en un costo en memoria.

Los problemas más comunes que se resuelven mediante esta técnica son los de optimización, donde podemos encontrar muchas soluciones pero requerimos únicamente la mejor (posiblemente la menor o la mayor, según lo que estemos buscando). Como pueden existir varias combinaciones que resulten en la mejor solución, decimos que encontramos una respuesta óptima, y no la respuesta óptima.

Para crear un algoritmo basado en Programación Dinámica, debemos seguir cuatro pasos: A continuación mencionaremos los elementos que identifican a los algoritmos de programación dinámica. Un enfoque “abajo-arriba” es más efectivo cuando toda (o casi toda) la tabla va a ser utilizada, mientras que el enfoque “arriba-abajo” es más útil cuando sólo algunos subproblemas guardados en la tabla necesitan ser resueltos. El uso de estos enfoques no cambian la complejidad del algoritmo, simplemente son más eficientes por un valor constante.

Un ejemplo sencillo de lo eficiente de la programación dinámica se puede observar al calcular los números de Fibonacci (sección 5.6). Aunque en este caso no es un problema de optimización, aprovecha el uso de tablas para transformar la solución recursiva de un tiempo exponencial a uno lineal.





© Pier Paolo Guillen Hernandez
World of πer