2. Programación Dinámica
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 2
p = [ 20, 13, 45, 34, 76]
def sumIterative(p):
result = 0
for i in range(len(p)):
result = result + p[i]
return result
Iterativa
def sumRecursive(p):
if len(p) <= 0:
return 0
return p[0] + sumRecursive(p[1 : ])
Recursiva
7. Programación Dinámica
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 7
Top-down
• Mismo procedimiento recursivo
• Guardar el resultado en memoria
• Algunas veces no resolverá todas
las posibles combinaciones
Bottom-up:
• Resolver los elementos más “pequeños”
primero
• Continuar ascendiendo basado en los
resultados anteriores
4
3
2
1
0
1
0
0
2
1
0
0
1
0
0
0
1
2
3
4
8. Programación Dinámica
Condiciones
• Subestructura optima: La solución optima a un problema está
construida a partir de la solución de sus sub-problemas.
• Superposición de problemas: Los problemas se sobreponen. En una
solución recursiva, el algoritmo calcula la solución a los mismos
sub-problemas muchas veces.
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 8
9. Programación Dinámica
Otros ejemplos:
• Longest common subsequence (LCS): Detectar la sub-secuencia
más grande a partir de dos secuencias, de aquí deriva la distancia
de Levenshtein utilizada para la detección de plagiarismo.
• Número de caminos: ¿Cuántos caminos hay entre un punto (0, 0) a
un punto (i, j)? De aquí deriva el algoritmo Floyd-Warshall.
• Multiplicación de cadenas de matrices: La multiplicación de
matrices es asociativa, ¿De que forma deberíamos de agrupar los
paréntesis para hacer la menor cantidad de cálculos?
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 9
10. Backtracking
• Genera todas las posibles combinaciones para un problema
• Se basa en el “stack” generado durante la recursión
• Cuando la función recursiva regresa, regresamos al estado anterior
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 10
11. Backtracking
Método general:
• Identificar los casos base
• Detectar los posibles estados que se pueden generar a partir de
un punto inicial
• Mover al primer estado y aplicar recursión
• Probar sobre todos los estados
• En caso de que ninguno resuelva el problema, volver al estado
inicial y regresar un valor
Public | Ricardo Sánchez Castillo 2015 | University of Nottingham 11