Programación Dinámica

Anuncio
Tema 6: Programación Dinámica
6.1
6.2
6.3
6.4
Los números combinatorios
El cambio de monedas
Subsecuencia común más larga
Caminos mínimos en grafos dirigidos
1
Los números combinatorios (I)
func comb(n: Entero, m: Entero)
dev (s: Entero)
var
c: Array[0..n, 0..m] de Entero
i, j: Entero
alg
desde i := 0 hasta n
c[i, 0] := 1
fdesde
desde i := 1 hasta n
c[i, 1] := i
fdesde
desde i := 2 hasta m
c[i, i] := 1
fdesde
desde i := 3 hasta m
desde j := 2 hasta i – 1
c[i, j] := c[i–1, j–1] + c[i–1, j]
fdesde
fdesde
desde i := m + 1 hasta n
desde j := 2 hasta m
c[i, j] := c[i–1, j–1] + c[i–1, j]
fdesde
fdesde
s:=c[n,m]
fin
2
1
Los números combinatorios (II)
func comb(n: Entero, m: Entero)
dev (s: Entero)
var
c: Array[0..m] de Entero
i, j: Entero
alg
c[0] := 1
desde i := 1 hasta m
c[i] := 1
desde j := i – 1 hasta 1 decrece 1
c[j] := c[j – 1] + c[j]
fdesde
fdesde
desde i := m + 1 hasta n
desde j := m hasta 1 decrece 1
c[j] := c[j – 1] + c[j]
fdesde
fdesde
s := c[m]
fin
3
El cambio de monedas
func cambioMonedas(u: Array[1..m] de Entero, n: Entero) dev (s: Entero)
var
c: Array [1..m, 0..n] de Entero
i, j: Entero
alg
desde i := 1 hasta m
desde j := 0 hasta n
si j = 0:
c[i, j] := 0
| j > 0 Y i = 1 Y j < u[i]:
c[i, j] := ∞
| j > 0 Y i = 1 Y j >= u[i]:
c[i][j] := 1 + c[i, j – u[i]]
| j > 0 Y i > 1 Y j < u[i]:
c[i, j] := c[i – 1, j]
| otras:
c[i, j] := min(c[i – 1, j], 1 + c[i, j – u[i]])
fsi
fdesde
fdesde
si c[m, n] = ∞:
<imprimir No Hay Solucion>
| otras:
s := c[m, n]
fsi
fin
4
2
El cambio de monedas
„
„
„
Ejemplo: Cantidad a cambiar 8 unidades y se dispone de
monedas de valores 1, 4 y 6
La solución es c[3, 8]
El algoritmo que reconstruye el conjunto de monedas usadas
seguirá la dirección de las flechas
5
Subsecuencia común más larga
func scl(x: Array[1..m] de Caracter, y: Array[1..n] de Carácter) dev (k: Entero)
var
i, j: Entero
c: Array[0..m, 0..n] de Entero
b: Array[1..m, 1..n] de Caracter
alg
desde i := 0 hasta m
desde j := 0 hasta n
El texto entre llaves si
si i = 0 O j = 0:
c[i, j] := 0
queremos tener una
| i > 0 Y j > 0 Y x[i] = y[j]:
matriz con la solución
c[i, j]:=1+c[i-1][j-1]
óptima
b[i, j] := ’d’
| i > 0 Y j > 0 Y x[i] ≠ y[j] Y c[i – 1, j] >= c[i, j – 1]:
c[i, j] := c[i – 1, j]
b[i, j] := ’a’
| otras:
c[i, j] := c[i, j – 1]
b[i, j] := ’i’
fsi
fdesde
fdesde
6
fin
3
Caminos mínimos en grafos dirigidos
func lm(g: Array[1..n, 1..n] de Entero) dev (D: Array [1..n,1..n] de Entero,
P: Array[1..n, 1..n] de Entero)
var
i, j, k: Entero
alg
D := g
P := <inicializa todos los elementos a 0>
desde k := 1 hasta n
desde i := 1 hasta n
desde j := 1 hasta n
El texto entre llaves si
si k ≠ i Y k ≠ j:
queremos tener una
si D[i, j] > D[i, k] + D[k, j]):
matriz con la solución
D[i, j] := D[i, k] + D[k, j]
óptima
P[i][j] := k
fsi
fsi
fdesde
fdesde
fdesde
fin
7
Caminos mínimos en grafos dirigidos
D
P
8
4
Descargar