Documentos de Académico
Documentos de Profesional
Documentos de Cultura
DINMICA
Nicols Fochesatto Universidad Nacional del Sur
Sucesin de Fibonacci
2
1 1 2 3 5 8 13
21/07/2015
Algoritmo Recursivo
3
21/07/2015
21/07/2015
5
4
3
2
3
2
1
2
0
1
0
21/07/2015
21/07/2015
Programacin Dinmica
7
Resolver
21/07/2015
Programacin Dinmica
8
5
4
3
2
1
21/07/2015
Programacin Dinmica
9
21/07/2015
DP para Fibonacci
10
arreglo DP[n];
DP[0] = DP [1] = 1;
FOR (i = 2 to n-1)
DP[i]=-1;
FUNCTION Fibo(n)
IF(DP[n] != -1 )
RETURN DP[n];
ELSE
DP[n] = Fibo(n-1)+Fibo(n-2);
RETURN DP[n];
END
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
21/07/2015
Top-Down VS Bottom-Up
12
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.
21/07/2015
Otros problemas
14
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
2
1
2
2
21/07/2015
Principio de Optimalidad
16
21/07/2015
Principio de Optimalidad
17
Camino
21/07/2015
21/07/2015
Ejemplos Clsicos
19
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
21/07/2015
Dinmica en rangos
21
21/07/2015
Multiplicacin de matrices
22
21/07/2015
Multiplicacin de matrices
23
21/07/2015
Multiplicacin de matrices
24
21/07/2015
Multiplicacin de matrices
25
Principio de optimalidad
Vamos
Solucin recursiva
m[i , j ]
si i = j
i 1
pk p j ) si i j
21/07/2015
Multiplicacin de matrices
26
Solapamiento de soluciones
La
[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]
[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
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);
21/07/2015
Multiplicacin de matrices
29
Solucin DP Top-Down
Multiplicacin de matrices
30
21/07/2015
Multiplicacin de matrices
31
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
21/07/2015
Otros ejemplos
33
ABB ptimo
Parenteseado:
21/07/2015
Otros ejemplos
34
http://www.spoj.com/problems/SUPPER/
http://www.spoj.com/problems/LIS2/
21/07/2015
Mscara de Bits
35
21/07/2015
Mscara de Bits
36
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}
21/07/2015
Mscara de Bits
37
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
21/07/2015
Aplicaciones
38
21/07/2015
21/07/2015
21/07/2015
Recursin:
21/07/2015
Variables globales
arreglo dp[1<<18]; // inicializado en
-1
arreglo p[18][18];
entero n; // nmero de peces
21/07/2015
21/07/2015
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
21/07/2015
21/07/2015
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
21/07/2015
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]
21/07/2015
Otro ejemplo
49
21/07/2015
Referencias
50
21/07/2015