Está en la página 1de 50

PROGRAMACIN

DINMICA
Nicols Fochesatto Universidad Nacional del Sur

Sucesin de Fibonacci
2

Sucesin infinita de nmeros naturales, de forma


que: f 0 = 1 y f1 = 1 , definindose el resto de la
sucesin como: f n+ 2 = f n + f n+1 , para todo n 0

1 1 2 3 5 8 13

Cmo podramos calcular el elemento 100 de la


sucesin?
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Algoritmo Recursivo
3

Un algoritmo recursivo es aquel que expresa la


solucin de un problema en trminos de una o ms
llamadas a s mismo.
Eventualmente debern alcanzarse uno o ms
casos de resolucin trivial, que llamaremos casos
bases, que no requieren de la solucin recursiva.

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Algoritmo Recursivo para Fibonacci


4

FUNCTION Fibo(n) // n entero


IF(n==0 or n==1)
RETURN 1;
ELSE
RETURN Fibo(n-1)+Fibo(n-2);
END

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Algoritmo Recursivo para Fibonacci


5

5
4

3
2

3
2
1

2
0

1
0

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Algoritmo Recursivo para Fibonacci


6

El tiempo de ejecucin de este algoritmo crece


exponencialmente con n .
Esta solucin es ineficiente: se est llamando a la
misma funcin con el mismo parmetro ms de una
vez.
El algoritmo carece de memoria: repite acciones ya
realizadas en el pasado.
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Programacin Dinmica
7

La programacin dinmica consiste en:


Dividir

un problema en subproblemas ms pequeos;

Resolver

cada subproblema hasta llegar a un caso base.

Hasta ac se asemeja mucho a una solucin recursiva,


pero
Se

guarda el resultado de cada instancia del problema la


primera vez que se calcula.
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Programacin Dinmica
8

5
4
3
2
1

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Programacin Dinmica
9

La definicin anterior se conoce como Top-Down con


Memoization.

Se sigue el orden natural de la recursin, pero se determina


si cierta instancia fue o no previamente calculada.

La alternativa es la solucin Bottom-Up.

Se construye la solucin desde los casos bases, siguiendo la


direccin opuesta al rbol visto anteriormente. Cada vez
que se quiere calcular un problema, se sabe que se tienen
los subproblemas calculados.
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

DP para Fibonacci
10

arreglo DP[n];
DP[0] = DP [1] = 1;
FOR (i = 2 to n-1)
DP[i]=-1;

Solucin Top Down con


memoization.

FUNCTION Fibo(n)
IF(DP[n] != -1 )
RETURN DP[n];
ELSE
DP[n] = Fibo(n-1)+Fibo(n-2);
RETURN DP[n];
END

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

DP para Fibonacci
11

Solucin Bottom - Up

FUNCTION Fibo(n)
arreglo DP[n];
DP[0] = DP [1] = 1;
FOR (i = 2 to n-1)
DP[i]= DP[i-1] + DP[i-2];
RETURN DP[n];
END

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Top-Down VS Bottom-Up
12

Ambos mtodos obtienen un tiempo de ejecucin de


orden polinomial O(n) para el caso de Fibonacci.
Mtodo Top-Down:
ms conveniente cuando el espacio de
subproblemas es mucho mayor que el realmente
necesario para la solucin se calculan slo las
subinstancias necesarias.
No es necesario preocuparse por el orden en que
se calculan las subinstancias
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Top-Down VS Bottom-Up
13

Mtodo Bottom-Up
Es conveniente si el rbol a resolver es muy
profundo al no acumularse operaciones
pendientes en el Stack.
No utiliza llamadas a funciones, lo que lo hace
ms rpido.

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Otros problemas
14

Existen algunos problemas clsicos que pueden


resolverse en forma sencilla con DP, por ejemplo:
Factorial

de un nmero;
Nmeros Combinatorios;
Por otro lado, puede necesitarse resolver un problema
de optimizacin hallar el mayor o menor valor que
cumple cierta condicin. Los algoritmos DP pueden
funcionar bien bajo ciertas condiciones.
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Solapamiento de subproblemas
15

Ocurre cuando el algoritmo recursivo visita ms de


una vez los mismos subproblemas.
Por ejemplo para el caso de los nmeros
combinatorios:
1
2
2
2
2
1
C
=
C
+
C
C =C + C , donde 1
0 y C 2 =C1 + C1
0
Se puede apreciar como C12 es necesario para
calcular tanto C 22 como C 23 .
3
2

2
1

2
2

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Principio de Optimalidad
16

Un problema requiere tener Subestructura ptima


para poder ser optimizado por DP.
La

solucin ptimal al problema contiene soluciones


ptimales a los subproblemas

Esto no vale para cualquier problema!

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Principio de Optimalidad
17

Sea G = (V, E) un grafo dirigido:


Camino

ms corto entre cualquier par de nodos


dado cualquier par de nodos u, v, encontrar el
camino de menor cantidad de arcos que los une.

Camino

simple ms largo encontrar el camino


simple entre cualquier par de nodos u, v que
contenga la mayor cantidad de vrtices.

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Reconstruccin de una solucin ptima


18

Se puede querer no slo saber CUL es el valor


ptimo, sino CMO llegar a ese valor para eso
se debe reconstruir la solucin ptima.
En cada paso se toman decisiones sobre como dividir
al problema en los subproblemas cuyas soluciones
darn la solucin ptima.
Es necesario guardar en cada estado toda la
informacin necesaria sobre la decisin ptima.
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Ejemplos Clsicos
19

Subset sum: Dados n nmeros enteros positivos,


decidir si se puede obtener una suma S usando
algunos de ellos (a lo sumo una vez cada uno).
Knapsack o problema de la mochila: Dados objetos
con peso y valor, queremos meter el mximo valor
posible en una mochila que soporta hasta P de
peso.

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Algunos Problemas
20

http://codeforces.com/problemset/problem/225/C
http://codeforces.com/problemset/problem/163/A
http://goo.gl/ARNe7
http://goo.gl/BJtPZ

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Dinmica en rangos
21

Son aquellos problemas cuyos estados consisten en


subintervalos de un rango original.
La decisin siempre consiste en qu ndice del
intervalo hacer la divisin en subrangos para
obtener la solucin ptima.

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Multiplicacin de matrices
22

Dadas n matrices { A1 , A2 ,..., An }, encontrar la forma


de realizar el producto, entre todas ellas, que
requiera menor cantidad de producto escalares.
Orden de la matriz Ai es pi 1 pi.
El costo (en cantidad de clculos) de multiplicar dos
matrices Ai y Ai +1 es pi 1 pi pi +1
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Multiplicacin de matrices
23

Rango genrico: Suponemos querer multiplicar en el


rango: { Ai , Ai +1 ,..., A j }, 1 i j n (Por qu no
hacerlo en un intervalo{ A1 , A2 ,..., A j }?)
Subrangos: Dividimos los rangos en un ndice k, de
forma que los subrangos son { Ai , Ai +1 ,..., Ak } y
{ Ak +1 , Ak + 2 ,..., A j }

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Multiplicacin de matrices
24

La cantidad de operaciones para esta solucin


sern la cantidad de operaciones para el primer
subrango, ms las del segundo, ms las operaciones
necesarias para multiplicar las matrices resultantes.

oper (i , j ) =oper (i , k ) + oper (k + 1, j ) + pi 1 pk p j

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Multiplicacin de matrices
25

Principio de optimalidad
Vamos

a demostrar que una solucin ptima de oper (i , j )


requiere soluciones ptimas de oper (i , k ) y oper (k + 1, j )
Demostramos por el absurdo.

Solucin recursiva

m[i , j ]

si i = j

min (m[i , k ] + m[k + 1, j ] + p


i k j

Nicols Fochesatto (UNS) - Programacin Dinmica

i 1

pk p j ) si i j

21/07/2015

Multiplicacin de matrices
26

Solapamiento de soluciones
La

solucin recursiva implica repetir varias veces las


mismas subinstancias.
[2,5]

[2,2]

[3,5]

[3,3]

[4,5]

[4,4]

[5,5]

[3,4]

[3,3]

[5,5]

[4,4]

[2,2]

[2,3]

[4,5]

[3,3]

[4,4]

[2,4]

[5,5]

[2,2]

Nicols Fochesatto (UNS) - Programacin Dinmica

[2,3]

[4,4]

[3,3]

21/07/2015

[5,5]

[2,2]

[3,4]

[3,3]

[4,4]

Multiplicacin de matrices
27

Solucin DP Bottom-up

MatrixMult (vector p, integer n) // p[n+1]


arreglo m[n][n];
FOR i = 1 a n
m[i,i]=0;
FOR i = (n-1) a 1
FOR j = (i+1) a n
m[i,j] = infinito;
FOR k = i a j-1
q = m[i,k]+ m[k+1,j] + p[i-1]p[k]p[j];
IF(q < m[i,j])
m[i,j] = q;
RETURN m
Nicols Fochesatto (UNS) - Programacin Dinmica 21/07/2015
END

Multiplicacin de matrices
28

Solucin DP Top-Down

Arreglo m[n][n];
FOR i = 1 a n
FOR j = 1 a n
m[i,j] = infinito;
MatrixMult (arreglo m, vector p, 1, n);

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Multiplicacin de matrices
29

Solucin DP Top-Down

MatrixMult (arreglo m, vector p, i, j) // p[n+1]


IF(m[i,j] < infinito)
RETURN m[i,j];
IF(i == j)
m[i,j]=0;
ELSE
FOR k = i a j-1
q = MatrixMult(m,p,i,k)+ MatrixMult(m,p,k+1,j)
+ p[i-1]p[k]p[j];
IF(q < m[i,j])
m[i,j] = q ;
RETURN m[i,j]
END
Nicols Fochesatto (UNS) - Programacin Dinmica 21/07/2015

Multiplicacin de matrices
30

Reconstruir Solucin ptima


El

algoritmo anterior slo devuelve la cantidad mnima


de operaciones.
Ambos mtodos se pueden modificar fcilmente para
guardar la informacin necesaria.
Basta con agregar un arreglo sol[n][n] que guarde la
informacin del ndice k ptimo para cada rango (i,j);
IF(q < m[i,j])
m[i,j] = q;
sol[i,j] = k;
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Multiplicacin de matrices
31

Reconstruir Solucin ptima


Una

vez que se tiene la tabla con los k ptimos, se


procede a reconstruir la solucin

IMPRIMIR-SOL-OPT(arreglos s, enteros i, j)
IF(i==j)
print A;
print i;
ELSE
print (;
IMPRIMIR-SOL-OPT(s,i,s[i,j]);
IMPRIMIR-SOL-OPT(s,s[i,j]+1,j);
print );
END
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Triangulacin optimal de polgonos


32

Se tiene un polgono convexo de n lados y vrtices v i ,


0 i n 1, siendo el lado i el formado por los vrtices
v i 1 y v i .

Se quiere encontrar una triangularizacin optimal de


acuerdo a algn criterio dado.

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Otros ejemplos
33

ABB ptimo

rbol de Bsqueda Binario ptimo: Dada una secuencia de


valores ordenados v1 < v 2 < ... < v n , compute un rbol
Binario de Bsqueda que minimice la cantidad de
comparaciones necesarias (profundidad) esperadas para
encontrar un elemento por ejemplo si se quisiera
programar un traductor de texto palabra por palabra.

Parenteseado:

Dada una cadena de caracteres {, }, [, ], ( y ), de longitud


par , dar la mnima cantidad de reemplazos que deben
realizarse al string para que quede bien parenteseado.
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Otros ejemplos
34

Longest Increasing Subsequence


Dada

una secuencia de nmeros, encontrar la


subsecuencia de nmeros que aparezcan de manera
creciente y que sea lo ms larga posible.

http://www.spoj.com/problems/SUPPER/
http://www.spoj.com/problems/LIS2/

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Mscara de Bits
35

Mtodo til cuando se quiere seleccionar un


subconjunto de un conjunto de elementos.
Consiste en representar a los subconjuntos de un
conjunto de n elemento por medio de la
representacin binaria de los nmeros que van
desde 0 hasta 2 n 1

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Mscara de Bits
36

Supongamos que tenemos el conjunto {1,3,8}, en


total hay 8 formas de elegir subconjuntos de ese
conjunto, como se representa a continuacin:
Nmero

Mscara

Subconjunto

Nmero

Mscara

Subconjunto

000

{}

100

{1}

001

{8}

101

{1,8}

010

{3}

110

{1,3}

011

{3,8}

111

{1,3,8}

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Mscara de Bits
37

Operadores Bitwise comparaciones bit a bit


Bit 1

Bit 2

AND(&)

OR(|)

XOR(^)

Shifting:
derecha ( x >> i ) , elimina de la representacin binaria
de x los ltimos i dgitos.
A izquierda ( x << i ) , agrega a la representacin
binaria de x un total de i dgitos 0 al final.
A

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Aplicaciones
38

Iteraciones sobre subconjuntos


A

veces se requiere, para calcular una funcin en


un conjunto, calcularla previamente sobre sus
subconjuntos.

Iteraciones sobre superconjuntos


De

la misma forma a veces se requiere, para


calcular una funcin en un subconjunto, calcularla
previamente en sus superconjuntos.
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Problema de los peces


39

Hay n (n 18) peces en el mar. Cada minuto se


encuentran dos peces al azar (la probabilidad es
uniforme para todo par de peces). Sea p[i ][ j ] la
probabilidad de que, dado un encuentro entre el
pez i y el pez j, el pez i se coma al j (y viceversa
para p[ j ][i ] ). Sabemos que p[i ][ j ] + p[ j ][i ] = 1 y
que p[i ][i ] = 0.
Cual es la probabilidad de que sobreviva el pez 0?
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Problema de los peces


40

Funcin: Dado un subconjunto (que representaremos


con la variable mask), nos devuelve la
probabilidad de que el pez 0 sobreviva en ese
subconjunto.
Casos base:
Cuando

el conjunto este compuesto por un pez la


funcin devolver 1 si ese pez es el 0, y 0 en
cualquier otro caso.
Cuando un subconjunto no contenga al pez 0, la
funcin devolver 0.
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Problema de los peces


41

Recursin:

De cada conjunto se pueden calcular sus subconjuntos, estos


sern los estados del problema los subconjuntos posibles
se crean suponiendo que uno de los peces fue comido (uno
de los 1 de la mscara se vuelve 0);
Cada subconjunto tiene una probabilidad de aparicin de
acuerdo a las probabilidad de que el pez que se quit
haya sido comido.
La probabilidad de que el pez 0 sobreviva en el conjunto
ser la probabilidad de que sobreviva en el subconjunto,
multiplicada por la probabilidad de pasar del conjunto al
subconjunto

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Problema de los peces


42

Variables globales
arreglo dp[1<<18]; // inicializado en
-1
arreglo p[18][18];
entero n; // nmero de peces

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Problema de los peces


43

FUNCTION f(entero mask)


IF(dp[mask]>=0) RETURN dp[mask];
vivos = 0; // cant. peces vivos en mask
FOR i = 0 to (n-1)
IF((mask>>i)%2==1) vivos = vivos+1;
pares = (vivos*(vivos-1))/2;//pares en mask
IF (vivos==1) // caso base
IF(mask=1) dp[mask]=1;
ELSE dp[mask]=0;
RETURN dp[mask];
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Problema de los peces


44

dp[mask]=0;
FOR i = 0 to (n-1)
FOR j = 0 to (i-1)
IF((mask>>i)%2==1 AND (mask>>j)%2==1)
IF(i!=0 AND j!=0)
dp[mask]= dp[mask] +
(f(mask^(1<<i))*p[j][i]+
f(mask^(1<<j))*p[i][j])/pares;
ELSE IF(i==0) dp[mask]= dp[mask] +
f(mask^(1<<j))*p[i][j])/pares;
ELSE IF(j==0) dp[mask]= dp[mask] +
f(mask^(1<<i))*p[j][i])/pares;
RETURN dp[mask]
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Problema de los peces


45

Supongamos ahora que queremos calcular la


probabilidad de supervivencia de todos los peces.
Podramos

repetir el algoritmo anterior n veces


O hacer algo ms eficiente.

Vamos a calcular, dado un subconjunto, la


probabilidad de haber llegado al mismo a travs
de los conjuntos de los que puede venir (sus
superconjuntos);
Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Problema de los peces


46

Nuestra solucin ser la funcin calculada en todos


los subconjuntos que slo contengan 1 pez.
Caso base: ahora el nico caso base ser que la
funcin en el conjunto inicial (el que contiene todo
los peces) debe devolver 1 (ya que siempre vamos
a iniciar desde ese conjunto).

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Problema de los peces


47

dp[(1<<n)-1] = 1;
FUNCTION f(entero mask)
IF(dp[mask]>=0) RETURN dp[mask];
vivos = 1; // cant. peces vivos en mask
FOR i = 0 to (n-1)
IF((mask>>i)%2==1) vivos = vivos+1;
pares = (vivos*(vivos-1))/2;//pares en mask

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Problema de los peces


48

dp[mask]=0;
FOR i = 0 to (n-1)
FOR j = 0 to (n-1)
IF((mask&(1<<i))!=0 AND (mask&(1<<j))==0)
dp[mask]= dp[mask] +
(f(mask|(1<<j))*p[i][j])/pares;
RETURN dp[mask]

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Otro ejemplo
49

En una clase hay 2n alumnos (n 8) y tienen que


hacer trabajos prcticos en grupos de a 2. El i-simo
alumno vive en el punto (xi , yi ) de la ciudad. El
profesor sabe que los alumnos se renen para hacer
los trabajos prcticos en la casa de uno de los dos
miembros del grupo. Por eso decide que la suma de
las distancias (rectas) entre compaeros de grupo
debe ser mnima. Dar esta distancia.

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

Referencias
50

Cormen, T. H. (2009). Introduction to algorithms. MIT


press.
TopCoder Tutorial: https://goo.gl/J2JkUh
Codechef Tutorial: https://goo.gl/9b1JBw
Bit Masking: https://goo.gl/1YSf4I

Nicols Fochesatto (UNS) - Programacin Dinmica

21/07/2015

También podría gustarte