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