Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Programación DinámicaDynamic Programming (DP)
Introducción
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
¿Cuál es el resultado de la siguiente operación?
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
Introducción
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
¿Cuál es el resultado de la siguiente operación?
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
14
Introducción
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
¿Y de la siguiente?
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
Introducción
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
¿Y de la siguiente?
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
15
Introducción
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
¿Por qué lo resolvieron más rápido?
Introducción
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
¿Por qué lo resolvieron más rápido?
Rta: Porque no necesitaron recontar sino que
recordaron que el resultado anterior era 14 y solo le
tuvieron que sumar 1.
¡Esa es la clave de la Programación Dinámica!
Recordar cosas para ahorrar tiempo después.
Introducción
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
“Those who cannot remember the past
are condemned to repeat it.“
----
“Aquellos quienes no pueden recordar el pasado
están condenados a repetirlo.”
---
Ejemplo 1:Serie de Fibonacci
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Fibonacci
fib(n) = 1; if n = 0
fib(n) = 1; if n = 1
fib(n) = fib(n-1) + fib(n-2)
Entonces, los primeros números de la serie serían:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Una posible solución podría ser utilizando recursividad:
public int fib (int n) {
if (n < 2)
return 1;
return fib(n-1) + fib(n-2);
}
Fibonacci: Solución recursiva
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Fibonacci: Solución recursiva
Para fib(6), se realizarán las siguientes ejecuciones:
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Fibonacci: Solución recursiva
Para fib(6), se realizarán las siguientes ejecuciones:
¡Se calcula 3 veces fib(3)!
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Podemos ver que la solución recursiva, repite múltiples
veces los mismos cálculos.
¿Y qué pasa si el N es mayor? Por ejemplo N=1000(Copiar el código y probar ejecución)
Para N grandes, esta solución no responde en los
tiempos esperados.
¿Cómo podemos mejorarla?
Fibonacci: Solución Recursiva
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Para evitar calcular múltiples veces lo mismo, podría ser
una buena alternativa almacenar cada valor de la serie
que ya calculamos, de manera que si necesitamos un
valor que ya hemos calculado previamente, obtenerlo en
O(1).
Solo calcularemos nuevos valores de la serie cuando
nunca antes lo hayamos hecho.
Fibonacci: Solución con P.D.
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Para ello, podemos utilizar un array de Integer
suficientemente grande para almacenar el valor más
grande de la serie que podríamos llegar a necesitar.
Inicializamos nuestro array con los 2 primeros valores de
la serie que conocemos fibo[0]=1, fibo[1]=1. Las
posiciones aún no calculadas tendrán valor null.
Tener cuidado si se desea utilizar una lista, ya que la consulta y
modificación de valores en una posición no siempre es O(1) y
puede hacer que nuestra solución no sea buena.
Fibonacci: Solución con P.D.
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Nuestra solución quedaría de la siguiente manera:
public int fib (int n) {
if (fibo[n] == null)
fibo[n] = fib(n-1) + fibo[n-2];
return fibo[n];
}
Fibonacci: Solución con P.D.
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
La solución con programación dinámica, es más óptima y
no recalcula múltiples veces los mismo valores.
Esta mejora, la obtenemos con el costo de un mayor
consumo de memoria para almacenar información que
nos puede ser útil en el futuro.
En este ejemplo, la información que guardamos para
utilizar programación dinámica es directamente la
información que necesitamos (los valores de la serie)
pero como ya veremos, no siempre tiene que ser así.
Fibonacci: Solución con P.D.
Programación Dinámica
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Programación Dinámica: ¿Qué es?
Programación dinámica NO ES un algoritmo.
Programación dinámica NO ES una estructura de datos.
Programación dinámica ES una técnica matemática...
que podremos aplicar a problemas que cumplan
determinadas condiciones, con el objetivo de mejorar la
complejidad computacional de un algoritmo, utilizando
determinadas estructuras de datos para almacenar
información que nos sea de utilidad en el futuro.
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Programación Dinámica: Definición
Es una técnica matemática orientada a la solución de
problemas con decisiones secuenciales (u) en etapas
sucesivas (k) donde se debe minimizar el coste total de
dichas decisiones.
En cada etapa se valora no sólo el coste actual de tomar una
decisión sino los costes futuros que se originan a partir de
ella.
Cada situación en que puede encontrarse el sistema en
cada etapa, se denomina estado (x), los cuales pueden ser
finitos o infinitos.
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Programación Dinámica: Definición
Mediante una decisión (uk), se va de un estado al comienzo de
una etapa (Xk) a otro estado al comienzo de la siguiente(Xk+1) .
En cada etapa se evalúa la decisión óptima para cada uno de
sus estados Xk. Cada estado guarda toda la información
necesaria para tomar las decisiones futuras sin necesidad de
conocer cómo se ha alcanzado dicho estado.
Es un procedimiento recursivo que resuelve de manera
iterativa, incorporando cada vez una etapa, partes cada vez
mayores del problema original.
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Principio de Optimalidad
Dado un estado, la política óptima para las siguientes etapas
no depende de la política tomada en las etapas anteriores.
La decisión óptima inmediata sólo depende del estado en el
que se está, no de cómo se llegó hasta él. Toda la información
sobre el pasado se resume en el estado en que se encuentra.
Una vez conocida la solución óptima global, cualquier
solución parcial que involucra sólo una parte de las etapas es
también una solución óptima.
Todo subconjunto de una solución óptima es a su vez una
solución óptima para un problema parcial.
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Conclusión
Frecuentemente para resolver un problema complejo se
tiende a dividir este en subproblemas, más pequeños,
resolver estos últimos (recurriendo posiblemente a nuevas
subdivisiones) y combinar las soluciones obtenidas para
calcular la solución del problema inicial.
2 6 4 8 1 4 6 3 2 6 4 8 4 8 9 3
2 6 4 8 1 4 6 3
2 6 4 8
2 6
2 6 4 8 4 8 9 3
1 4 6 3 2 6 4 8 4 8 9 3
4 8 1 4 6 3 2 6 4 8 4 8 9 3
2 6 4 8 1 4 6 3 2 6 4 8 4 8 9 3
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Conclusión
Puede ocurrir que la división natural del problema conduzca a un
gran número de subejemplares idénticos.
Si resolvemos cada uno de ellos sin tener en cuenta las posibles
repeticiones, resulta un algoritmo ineficiente; en cambio
resolvemos cada ejemplar distinto una sola vez y se conserva el
resultado, el algoritmo obtenido es mucho mejor.
2 6 4 8 1 4 6 3 2 6 4 8 4 8 6 3
2 6 4 8 1 4 6 3
2 6 4 8
2 6
2 6 4 8 4 8 6 3
1 4 6 3 2 6 4 8 4 8 6 3
4 8 1 4 6 3 2 6 4 8 4 8 6 3
2 6 4 8 1 4 6 3 2 6 4 8 4 8 6 3
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Conclusión
Esta es la idea de la programación dinámica: no calcular
dos veces lo mismo y utilizar normalmente una tabla de
resultados que se va rellenando a medida que se
resuelven los subejemplares.
La programación dinámica es un método ascendente. Se
resuelven primero los subejemplares más pequeños y
por tanto más simples. Combinando las soluciones se
obtienen las soluciones de ejemplares sucesivamente
más grandes hasta llegar al ejemplar original.
Ejemplo 2:Suma de Subrectángulos
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Suma de Subrectángulos
Dada la siguiente matriz, ¿Cuál es el subrectángulo cuya
sumatoria de elementos internos es máxima?
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Suma de Subrectángulos
Si sumamos toda la matriz, quizás no obtenemos el
mayor valor, ya que también tenemos valores negativos:
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Suma de Subrectángulos
Deberíamos considerar diferentes subrectángulos para
encontrar aquel cuya sumatoria es máxima:
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
10
4
8
-13
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Suma de Subrectángulos: Solución sin P. D.
Podemos probar todos los tamaños de subrectángulos, en cada posición de
la matriz, sumando todos los elementos internos, e ir guardando el mayor
resultado.
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
1x1
2x1
1x2
2x2
...
...
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Suma de Subrectángulos: Solución con P. D.
Para resolver este problema con programación dinámica, utilizaremos una
matriz auxiliar (PD) para almacenar cierta información “intermedia” que nos
ayudará a calcular rápidamente la sumatoria de subrectángulos.
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Suma de Subrectángulos: Cálculo de matriz PD
-5 -2 3
-2 -7 -12
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
Matriz original Matriz P.D. (con sumatorias parciales)
-5 +3 +5 +3 -8 -10 = -12
En cada posición almacenamos la sumatoria desde M[0][0] hasta M[ i ][ j ]:
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
-5 -2 3 11
-2 -7 -12 -2
-1 2 0 4
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
Matriz original Matriz P.D. (con sumatorias parciales)
PD[i][j] = + PD[i-1][j] + PD[i][j-1] - PD[i-1][j-1] + M[i][j]PD[i][j] = + 0 + (-2) - (-12) + (-6) = 4
Cada celda, también podemos completarla ¡usando Programación Dinámica!
Suma de Subrectángulos: Cálculo de matriz PD
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
-5 -2 3 11 13 14 10
-2 -7 -12 -2 -2 4 4
-1 2 0 4 4 19 22
11 21 20 20 11 31 28
-4 14 1 7 1 11 11
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
Matriz original Matriz P.D. (con sumatorias parciales)
Al completar la matriz de P.D., tendremos el siguiente resultado:
Suma de Subrectángulos: Cálculo de matriz PD
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
-5 -2 3 11 13 14 10
-2 -7 -12 -2 -2 4 4
-1 2 0 4 4 19 22
11 21 20 20 11 31 28
-4 14 1 7 1 11 11
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
M PD
¿Cómo nos ayudará nuestra matriz PD a resolver nuestro problema original?
Suma de Subrectángulos: Solución con P.D.
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
-5 -2 3 11 13 14 10
-2 -7 -12 -2 -2 4 4
-1 2 0 4 4 19 22
11 21 20 20 11 31 28
-4 14 1 7 1 11 11
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
M PD
Supongamos que queremos saber la sumatoria interna de este subrectángulo
que va desde M[i][j] hasta M[f][c]
Suma de Subrectángulos: Solución con P.D.
j c
i
f
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
-5 -2 3 11 13 14 10
-2 -7 -12 -2 -2 4 4
-1 2 0 4 4 19 22
11 21 20 20 11 31 28
-4 14 1 7 1 11 11
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
M PD
Si tomamos PD[f][c], tenemos la sumatoria de todos los valores que queremos,
el problema es que también está sumando partes de M que no nos interesan.
Suma de Subrectángulos: Solución con P.D.
PD[f][c] contiene la sumatoria desde M[0][0] hasta M[f][c]
j c
i
f
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
-5 -2 3 11 13 14 10
-2 -7 -12 -2 -2 4 4
-1 2 0 4 4 19 22
11 21 20 20 11 31 28
-4 14 1 7 1 11 11
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
M PD
Pero si a esa sumatoria parcial, le restamos PD[f][j-1], estaríamos restando
todo un grupo de valores que no nos interesan.
Suma de Subrectángulos: Solución con P.D.
PD[f][j-1] contiene la sumatoria desde M[0][0] hasta M[f][j-1]
j c
i
f
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
-5 -2 3 11 13 14 10
-2 -7 -12 -2 -2 4 4
-1 2 0 4 4 19 22
11 21 20 20 11 31 28
-4 14 1 7 1 11 11
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
M PD
Y si luego restamos PD[i-1][c], estaríamos restando otra parte que no nos
sirve… el problema ahora es que restamos 2 veces una sección.
Suma de Subrectángulos: Solución con P.D.
PD[i-1][c] contiene la sumatoria desde M[0][0] hasta M[i-1][c]
j c
i
f
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
-5 -2 3 11 13 14 10
-2 -7 -12 -2 -2 4 4
-1 2 0 4 4 19 22
11 21 20 20 11 31 28
-4 14 1 7 1 11 11
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
M PD
Pero esa sección que restamos 2 veces, podemos compensarla volviendo a
sumarla con el acumulado en PD[i-1][j-1].
Suma de Subrectángulos: Solución con P.D.
PD[i-1][j-1] contiene la sumatoria desde M[0][0] hasta M[i-1][j-1]
j c
i
f
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
-5 -2 3 11 13 14 10
-2 -7 -12 -2 -2 4 4
-1 2 0 4 4 19 22
11 21 20 20 11 31 28
-4 14 1 7 1 11 11
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
M PD
Finalmente, si efectuamos este simple cálculo, podemos obtener la sumatoria
de únicamente los valores que nos interesaban ¡en O(1)!
Suma de Subrectángulos: Solución con P.D.
j c
i
f
sumatoria = + PD[f][c] - PD[f][j-1] - PD[i-1][c] + PD[i-1][j-1]sumatoria = + 31 - 21 - 4 + (-7) = -1
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Suma de Subrectángulos: Solución con P. D.
Este cálculo, lo tenemos que realizar para cada tamaño de subrectángulo en
cada posición de la matriz (de estos pasos no escapamos).
La ventaja es que pudimos resolver sumatorias que son costosas en tiempo
constante (con un mayor costo de memoria).
-5 3 5 8 2 1 -4
3 -8 -10 2 -2 5 4
1 8 3 -6 0 9 3
12 7 1 -4 -9 5 -6
-15 8 -12 6 3 -10 3
1x1
2x1
1x2
2x2
...
...
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Suma de Subrectángulos: Solución con P. D.
En este ejemplo, la información que guardamos para
utilizar programación dinámica no es directamente el
resultado del problema o valores que necesitamos, sino
que almacenamos información intermedia que nos
simplifica y mejora un determinado proceso interno de
nuestro algoritmo.
Estos casos suelen ser más complejos de detectar y
requieren mayor práctica de la metodología, ya que no
son tan triviales como el ejemplo de Fibonacci.
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Solución sin P.D. Solución con P.D.
Generación de matriz de P.D. ¿? ¿?
Generación de subrectángulos
(distintos tamaños) ¿? ¿?
Movimiento de subrectángulos
(por cada posición de M) ¿? ¿?
Cálculo de la sumatoria de los
elementos internos ¿? ¿?
Complejidad Computacional ¿? ¿?
Análisis de complejidad computacional de ambas soluciones:
Suma de Subrectángulos: Análisis C.C.
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Solución sin P.D. Solución con P.D.
Generación de matriz de P.D. - O(N2)
Generación de subrectángulos
(distintos tamaños) O(N2) O(N2)
Movimiento de subrectángulos
(por cada posición de M) O(N2) O(N2)
Cálculo de la sumatoria de los
elementos internos O(N2) O(1)
Complejidad Computacional ¿? ¿?
Análisis de complejidad computacional de ambas soluciones:
Suma de Subrectángulos: Análisis C.C.
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Solución sin P.D. Solución con P.D.
Generación de matriz de P.D. - O(N2)
Generación de subrectángulos
(distintos tamaños) O(N2) O(N2)
Movimiento de subrectángulos
(por cada posición de M) O(N2) O(N2)
Cálculo de la sumatoria de los
elementos internos O(N2) O(1)
Complejidad Computacional ¿? ¿?
Pre-cálculo
Solución
+
Análisis de complejidad computacional de ambas soluciones:
Suma de Subrectángulos: Análisis C.C.
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Solución sin P.D. Solución con P.D.
Generación de matriz de P.D. - O(N2)
Generación de subrectángulos
(distintos tamaños) O(N2) O(N2)
Movimiento de subrectángulos
(por cada posición de M) O(N2) O(N2)
Cálculo de la sumatoria de los
elementos internos O(N2) O(1)
Complejidad Computacional O(N6) O(N2) + O(N4)
Pre-cálculo
Solución
+
Análisis de complejidad computacional de ambas soluciones:
Suma de Subrectángulos: Análisis C.C.
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Solución sin P.D. Solución con P.D.
Generación de matriz de P.D. - O(N2)
Generación de subrectángulos
(distintos tamaños) O(N2) O(N2)
Movimiento de subrectángulos
(por cada posición de M) O(N2) O(N2)
Cálculo de la sumatoria de los
elementos internos O(N2) O(1)
Complejidad Computacional O(N6) O(N4)
Pre-cálculo
Solución
+
Análisis de complejidad computacional de ambas soluciones:
Suma de Subrectángulos: Análisis C.C.
Cátedra de Programación Avanzada - Ingeniería Informática
Departamento de Ingeniería e Investigaciones Tecnológicas
Encontrar la subsecuencia de longitud máxima
Dudas
¿?