Você está na página 1de 14

Programao Dinmica

Notas de aula da disciplina IME 04-10823 ALGORITMOS E ESTRUTURAS DE DADOS II Paulo Eustquio Duarte Pinto (pauloedp arroba ime.uerj.br)

Programao Dinmica
Partio de Inteiros
Dado n inteiro, determinar o nmero de maneiras de particionamento de n.

Exemplo 1:
n = 4

5 maneiras distintas:
4 2 + 2 1 + 1 + 1 + 1 3 + 1 2 + 1 + 1

Exemplo 2:
n = 6

11 maneiras distintas:
6 4 3 3 2 1 + + + + + 2 3 1 + 1 2 + 1 + 1 1 + 1 + 1 + 1 + 1 5 4 3 2 2 + + + + + 1 1 2 2 1 + + + + 1 1 2 1 + 1 + 1

maio/2012

Programao Dinmica
Partio de Inteiros Formulao recursiva: dado n,
T(n, p) = nmero de parties onde a maior parcela p T(n, p) = 0, se (n < 0) ou (p = 0) T(n, p) = 1, se (n = 0) T(n, p) = T(n p, p) + T(n, p - 1), n > 0

Programao Dinmica
Partio de Inteiros
T(n, p) = 0, se (n < 0) ou (p = 0) T(n, p) = 1, se (n = 0) T(n, p) = T(n p, p) + T(n, p - 1), n > 0 Quer-se obter T(n, n).

A idia da programao dinmica evitar a recurso, de forma anloga memorizao, mas calculando, de forma bottom-up, todos os subproblemas menores do que o problema a ser solucionado.

Procura-se obter T(n, n). Pode-se implementar a recurso com memorizao.

Neste caso, possvel usar a idia da PD!

Programao Dinmica
Partio de Inteiros
T(n, p) = 0, se (n < 0) ou (p = 0) T(n, p) = 1, se (n = 0) T(n, p) = T(n p, p) + T(n, p - 1), n > 0 Quer-se obter T(n, n).

Programao Dinmica
Partio de Inteiros
T(n, p) = 0, (n < 0) ou (p = 0) T(n, p) = 1, (n = 0) T(n, p) = T(n p, p) + T(n, p - 1), (n > 0)
Algoritmo 1 (por linha): Para p de 0 a n: T[0, p] 1; Fp; Para i de 1 a n: T[i, 0] 0; Para p de 1 a n: Se (i p) Ento T[i, p] T[i, p-1] + T[i-p, p]; Seno T[i, p] T[i, p-1]; Fp; Fp;

Para implementar PD, calcular T(n, p) em ordem crescente por n e p, comeando por qualquer um dos dois parmetros.

Complexidade: O(n2)

Programao Dinmica
Partio de Inteiros
T(n, p) = 0, (n < 0) ou (p = 0) T(n, p) = 1, (n = 0) T(n, p) = T(n p, p) + T(n, p - 1), (n > 0)

Programao Dinmica
Partio de Inteiros Clculo de T(5, 5)
0 0 1 2 3 4 5 1 2 3 4 5

1 0 0 0 0 0

1 1 1 1 1 1

1 1 2 2 3

1 1

1 1 2 3 5

1
1 2 3 5 7

Algoritmo 2 (por coluna): T[0,0] 1; Para i de 1 a n: T[i, 0] 0; Fp; Para p de 1 a n: Para i de 0 a n: Se (i p) Ento T[i, p] T[i, p-1] + T[i-p, p]; Seno T[i, p] T[i, p-1]; Fp; Fp;

2
3 4 5

Programao Dinmica
Partio de Inteiros Exerccio Completar a tabela abaixo, para n = 7
0 0 1 2 3 4 5 1 2 3 4 5

Programao Dinmica
Moedas
Dados os tipos de moedas de um pas, determinar o nmero de maneiras distintas para dar um troco de valor n.

H 13 maneiras distintas:
25, 1 10, 10, 5, 1 10, 10, 1...1 10, 5, 5, 5, 1 10, 5, 5, 1...1 10, 5, 1...1 10, 1...1 5, 5, 5, 5, 5, 1 5, 5, 5, 5, 1...1 5, 5, 5, 1...1 5, 5, 1...1 5, 1...1 1...1

1 0 0 0 0 0

1 1 1 1 1 1

1 1 2 2 3 3

1 1 2 3 4 5

1 1 2 3 5 6

1 1 2 3 5 7

Exemplo:
V = {1,5,10,25,50,100} m = 6 n = 26

Programao Dinmica
Moedas Formulao recursiva: dados m, n
T(p, n) = formas distintas de dar um troco n, usando os p tipos iniciais de moedas, V[1]...V[p] T(p, n) = 0, (n < 0) T(p, n) = 1, (n = 0) T(p, n) = T(i, n V[i]), (n > 0), 1 i p

Programao Dinmica
Moedas
Exemplo: V = {1,5,10,25,50,100} m = 6 n = 26
T(2, 26 5)= T(2, 21)

H 13 maneiras distintas:
T(6, 26-100)= T(6,-74) T(5, 26 50)= T(5,-24) T(4, 26 25)= T(4, 1) T(3, 26 10)= T(3, 16)

A soluo do problema obter T(m, n).


T(1, 26 - 1) = T(1, 25)

----25, 1 10, 10, 5, 1 10, 10, 1...1 10, 5, 5, 5, 1 10, 5, 5, 1...1 10, 5, 1...1 10, 1...1 5, 5, 5, 5, 5, 1 5, 5, 5, 5, 1..1 5, 5, 5, 1..1 5, 5, 1..1 5, 1..1 1,1...1

Programao Dinmica
Moedas
Exemplo: V = {1, 5, 10, 25, 50, 100} m = 6, n = 20

Programao Dinmica
Moedas
A soluo por PD consiste em preencher a tabela m x n por ordem crescente do tamanho dos subproblemas, sem necessidade de recurso. H duas formas de fazer isso: ou + +

0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 2 0 1 2 3 4 5 6 7 8 9 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 3 1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6 6 6 6 6 9 4 1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6 6 6 6 6 9 5 1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6 6 6 6 6 9 6 1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6 6 6 6 6 9

Ex. da 1a forma:
0 1 2 3 4 5 6 7 8 9 1 0 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 2 2 2 2 3 1 1 1 3 1 2 1 3 1 3 1 3 1 4 1 3 1 5 1 4 1 6 1 4 1 7 1 4 1 8 1 4 1 9 1 4 2 0 1 5

3 1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6 6 6 6 6 9

Programao Dinmica
Moedas
V = {1, 5, 10, 25, 50, 100} Exerccio: Completar a tabela abaixo para n = 26
0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 2 0 1 2 3 4 5 6 7 8 9 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 3 1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6 6 6 6 6 9 4 1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6 6 6 6 6 9 5 1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6 6 6 6 6 9 6 1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6 6 6 6 6 9
Fim;

Programao Dinmica
Moedas
T(p, n) = 0, (n < 0) ou (p = 0) T(p, n) = 1, (n = 0) T(p, n) = 1 i pT(i, n V[i]), (n > 0)

Algoritmo, com preenchimento linha x coluna:


Moedas;
Para p de 1 a m: T[p, 0] 1; Para i de 1 a n: tot 0; Para k de 1 a p: Se ((i V[k]) 0) Ento tot tot + T[k, i V[k]]; Fp; T[p, i] tot; Fp; Fp;

Complexidade: O(n.m2)

Programao Dinmica
Moedas PD x Memorizao
25, 50, 100} V = {1, 5, 10,

Programao Dinmica
Moedas Outra formulao recursiva: dados m, n
T(p, n) = formas distintas de dar um troco n, usando os p tipos iniciais de moedas, V[1]...V[p] T(p, n) = 0, (n < 0) ou (p = 0) T(p, n) = 1, (n = 0) T(p, n) = T(p, n V[p]) + T(p-1, n), (n > 0)

0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 2 0 1 2 3 4 5 6 7 8 9 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 2 1 -1 -1 -1 -1 2 -1 -1 -1 -1 3 -1 -1 -1 -1 4 -1 -1 -1 -1 -1 3 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 9

A soluo do problema obter T(m, n).

Programao Dinmica
Moedas
Exemplo: V = {1, 5, 10, 25, 50, 100} m = 6, n = 20

Programao Dinmica
Mochila (0/1)
Dada uma mochila com capacidade M e t tens com peso wi cada, verificar se existe uma combinao de itens que preencha exatamente a mochila. Exemplo: Dado o conjunto de tens {7, 3, 5, 9, 15}, possvel preencher exatamente mochilas com capacidades 25 e 27, mas no possvel preencher mochila com capacidade 26.

0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 2 0 1 2 3 4 5 6 7 8 9 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 3 1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6 6 6 6 6 9 4 1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6 6 6 6 6 9 5 1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6 6 6 6 6 9 6 1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6 6 6 6 6 9

Programao Dinmica
Mochila (0/1)
Define-se K(q, n) = x = indicador de soluo quando se usa os q itens iniciais numa mochila de capacidade n. x =-1 no h soluo, cc indica o menor ndice de tem que que completa a mochila.
Formulao recursiva:
K(q, K(q, K(q, K(q, n) n) n) n) = = = = 0, se n = 0, K(q-1, n), se K(q-1,n) -1, q, se K(q-1, n-wq) -1, -1, nos demais casos 0 n M; 1 q t; 0 n M; 1 q t; K(q, K(q, K(q, K(q,

Programao Dinmica Mochila (0/1)


n) n) n) n) = = = = 0, se n = 0, K(q-1, n), se K(q-1,n) -1, q, se K(q-1, n-wq) -1, -1, nos demais casos 0 n M; 1 q t; 0 n M; 1 q t;

Algoritmo:
K[0, 0] 0; Para j de 1 a M: K[0, j] -1; Fp; Para i de 1 a t: Para j de 0 a M: Se (K[i-1, j] -1) Ento K[i, j] K[i-1, j] Seno Se (j W[i]) e (K[i-1, j-W[i]] -1) Ento K[i, j] i; Seno K[i, j] -1; Fp; Fp;

Complexidade: O(t.M)

Programao Dinmica
Mochila (0/1) Exemplo: W= {7, 3, 5,
Obs: -1 no representado
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 0 1 (7) 2 (3) 3 (5) 4 (9) 0 0 0 0 0 2 2 2 2 3 3 3 1 1 1 3 2 2 3 3 3 3 4 3 4 4 4 0 1 (7) 2 (3) 3 (5) 4 (9)

Programao Dinmica
Mochila (0/1) W = {7, 3, 5, 9, 15}

9,

15} M = 20

Exerccio: Completar a tabela abaixo para M = 27


0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 0 0 0 0 0 2 2 2 2 3 3 3 1 1 1 3 2 2 3 3 3 3 4 3 4 4 4

1 3 4 2 1 3 4 2

1 3 4 2 1 3 4 2

5 (15) 0

4 3 4 4 5 4 5

5 (15) 0

4 3 4 4 5 4 5

Programao Dinmica
Mochila (0/1) W = {7, 3, 5, 9, 15} Exerccio: Encontrar a soluo para M = 19
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 0 1 (7) 2 (3) 3 (5) 4 (9) 0 0 0 0 0 2 2 2 2 3 3 3 1 1 1 3 2 2 3 3 3 3 4 3 4 4 4
0 1 2 3 4 5 (7) (3) (5) (9) (15)

Programao Dinmica
Mochila (0/1) Apresentao de uma soluo
Soluo: j M; i t; Enquanto (j 0): Escrever (W[K[i, j]]): t j; j j - W[K[i,j]]; i K[i,t] - 1; Fe; Fim;

Para M = 17, a sada seria:


0 0 0 0 0 0 0 1 2 3 4 5 6 7 1 1 1 1 1 8 9

9 5

10 11 12 13 14 15 16 17 18 19 20

1 3 4 2 1 3 4 2

5 (15) 0

4 3 4 4 5 4 5

2 2 2 2

3 3 3

3 3 3

4 4

2 2 2 2

3 3 3

4 4

3 3 3

4 4

4 4

4 4

Programao Dinmica
Mochila (0/1) outras verses
a) usar dois indicando de menor Exemplo: valores booleanos em cada clula, o primeiro se h soluo e o segundo se o tem atual o ndice para a soluo W = {7, 3, 5, 9, 15} M = 20

Programao Dinmica
Mochila (0/1) outras verses
b) usar um vetor ao invs de uma matriz Exemplo: W = {7, 3, 5, 9, 15} M = 20
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 0 -1 -1 2 -1 3 -1 1 3 4 2 -1 3 -1 4 3 4 4 5 4 5

Obs: clula em branco com (F,F)


0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 0 1 (7) 2 (3) 3 (5) 4 (9) VF VF VF VF VF VV VF VF VF VV VF VF VV VF VF VV VV VF VV VF VF VV VV VF VV VV VV VF VF VF VF VV VF VV

Algoritmo:
K[0] 0; Para j de 1 a M: K[j] -1; Fp; Para i de 1 a t: Para j de M descendo a W[i]: Se (K[j] = -1) e (K[j-W[i]] 0) Ento K[j] i; Fp; Fp;

VF VF VV VF VF VF VF VF

5 (15) VF

Programao Dinmica
Mochila (0/1) outras verses
b) usar um vetor ao invs de uma matriz Exemplo: W = {7, 3, 5, 9, 15} M = 20
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 0 -1 -1 2 -1 3 -1 1 3 4 2 -1 3 -1 4 3 4 4 5 4 5

Programao Dinmica
Mochila (0/1) outras verses
b) usar um vetor ao invs de uma matriz Problema Ferry Loading (Val 12601) Tem-se um ferry de comprimento lf, duas linhas para carros e uma fila dada de carros, com seus comprimentos lci. Quer-se saber quantos carros podem ser carregados, obedecendo-se a fila. Dados: n carros de comprimentos lci dados e o ferry com comprimento lf. lf = 9 Fila: 2, 5, 4, 3, 3, 3, 1, 2 Sol: 5 (2/1, 5/2, 4/2, 3/1, 3/1)

Exerccio: mostrar a situao do vetor acima aps o processamento de cada tem, a partir da situao inicial:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

Programao Dinmica
Mochila (0/1) outras verses
b) usar um vetor ao invs de uma matriz
Problema Ferry Loading (Val 12601) Tem-se um ferry de comprimento lf, duas linhas para carros e uma fila dada de carros, com seus comprimentos lci. Quer-se saber quantos carros podem ser carregados, obedecendo a fila. lf = 9, lc = (2, 5, 4, 3, 3, 3, 1, 2) 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 2 -1 2 -1 -1 -1 1 -1 3 2 3 2 -1 3 -1 1 -1 3 2 3 2 4 3 -1 1 -1 3 2 3 2 4 3 -1 1 -1 3 2 3 2 4 3 tot SIT 0 2 V 7 V 11 V 14 V 17 V 20 F

Programao Dinmica
Mochila (0/1) outras verses
Problema Ferry Loading (Val 12601) - Escolha dos carros

Algoritmo: K[*] -1; K[0] 0; F[*] 0; i 1; lotado F; tot 0; Enquanto (i t) E (no lotado): tot tot + lc[i]; lotado V; Para j descendo de lf a lc[i]: Se (K[j-lc[i]] > -1) E ((tot-j) lf) Ento lotado F; F[i] 1; Se (K[j] = -1) Ento k[j] i; Fp; i i+1; Fe; Fim;

Programao Dinmica
Mochila (0/1) outras verses
Problema Ferry Loading (Val 12601) - Determinao das filas

Programao Dinmica
Mochila (0/1) outras verses
c) contar o nmero de itens na soluo Exemplo: W = {7, 3, 5, 9, 15} M = 20

Algoritmo: i lf; Enquanto (K[i] = -1): i i-1; Fe; Enquanto (i > 0): j K[i]; F[j] 2; i i-lc[j]; Fe; Fim; Vetor K
i 9 5 0 0 1 2 3 4 5 6 7 8 9 0 -1 1 -1 3 2 3 2 4 3 1 1 1 1 2 1 2 2 3 2 2 2 4 1 1 1 5 6 7 8 1 0 0 0 1 0 0 0 1 0 0 0 SIT F

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 0 1 2 3 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 3 1 3 4 2 3 4 3 5 4 4 5 4 5

Vetor F

Programao Dinmica
Mochila (0/1) outras verses
c) contar o nmero de itens na soluo Exemplo: W = {7, 3, 5, 9, 15} M = 20

Programao Dinmica
Mochila (0/1) outras verses
c) contar o nmero de itens na soluo Problema Tug of War (Val 10032) Tem-se n competidores, e so dados os pesos de cada um. Quer-se dividir as pessoas em dois times tal que o nmero de competidores difira no mximo em 1 e a soma dos pesos deve ser mnima. Indicar os pesos de cada grupo.

Algoritmo:
K[0,0] 0; Para j de 1 a M: K[0,j] -1; Fp; Para i de 1 a t: Para j de 0 a M: K[i,j] -1; Fp; Para p de i descendo a 1: Para j de W[i] a M: Se (K[p, j] = -1) e (K[p-1,j-W[i]] 0) Ento K[p, j] i; Fp; Fp; Fp;

Dados: n = 9 Pesos: 100, 65, 70, 82, 95, 71, 71, 66, 84 Sol: 350 354 (1, 2, 2, 2, 1, 1, 2, 2, 1)

Programao Dinmica
Mochila (0/1) outras verses
c) contar o nmero de itens na soluo Problema Joys of Farming (Val 11331) Tem-se n casas, cada uma com 2 quartos, em cada quarto um nmero varivel de camas. Quer-se distribuir m moas e r rapazes pelas casas, tal que em cada quarto s tenha ou moas ou rapazes e no podendo os dois quartos de uma mesma casa serem ocupados pelo mesmo sexo. possvel fazer a distribuio?

Programao Dinmica
Mochila (0/1) -

c) contar o nmero de itens na soluo Exerccio: W = {7, 3, 5, 9, 15} M = 19 Mostrar o preenchimento da matriz

Dados: n = 5, m = 32, r = 40 Quartos: 3/8, 5/6, 4/7, 6/10, 11/13 Sol: S (moas: 3, 6, 4, 6, 13 rapazes: 8, 5, 7, 10, 10)

Programao Dinmica
Mochila (0/1) outras verses
d) Mochila com peso e valor: a cada tem, alm do peso(p) associado um valor(v). O objetivo passa a ser determinar o valor mximo que pode comportar a mochila Ex: W = {(7,3), (3,7), (5,11), (9,12), (15,15)} M = 20
0 0 0 0 0 0 0 0 0 0 0 1 2 3

Programao Dinmica
Mochila (0/1) outras verses Peso e Valor
Ex: W = {(7,3), (3,7), (5,11),
4 5 6 7 8 9 (9,12), (15,15)} M = 20 10 11 12 13 14 15 16 17 18 19 20

10 11 12 13 14 15 16 17 18 19 20

0 -1 -1 2 -1 3 -1 1 3 4 2 -1 4 -1 4 3 4 4 5 4 5 0 0 0 7 0 11 0 3 18 12 10 0 19 0 23 21 15 30 22 22 26

2 7 2 7 2 7 2 7

3 11 3 11 3 11

1 3 1 2 3 10 1 3 2 3 18 10 1 3 4 2 3 18 12 10 1 3 4 2 3 18 12 10

3 14 4 19 4 19

4 23 4 23

3 21 3 21 3 21

4 15 4 15

4 4 30 22 4 5 4 5 30 22 22 26

Programao Dinmica
Mochila (0/1) outras verses Peso e Valor
d) Mochila com peso e valor: a cada tem, alm do peso(W) associado um valor(V). O objetivo passa a ser determinar o valor mximo que pode comportar a mochila Ex: W = {(7,10), (3,6), (5,11), (9,12), (15,15)} M = 20 Algoritmo:
K[0].me 0; K[0].vm 0; Para j de 1 a M: K[j].me -1; K[j].vm 0; Fp; Para i de 1 a t: Para j descendo de M a W[i]: Se (K[j-W[i]].me 0) e (K[j].vm < (K[j-W[i]].vm+V[i]) Ento K[j].me i; Fp; Fp; K[j].vm K[j-W[i]].vm+V[i];

Programao Dinmica
Mochila (0/1) outras verses

Exerccio: mostrar a situao do vetor para os seguintes tens, M = 20. Ex: W = {(4,5), (3,4), (7,10), (10,15)} M = 20

Programao Dinmica
Mochila outras verses
e) Mochila mltiplos itens: existem infinitos objetos de cada tipo de tem Ex: W = {7, 3, 5, 9, 15} M = 20

Programao Dinmica
Mochila outras verses
e) Mochila mltiplos itens: existem infinitos objetos de cada tipo de tem Ex: W = {7, 3, 5, 9, 15} M = 20

6 2

7 1

8 3

9 2

10 11 12 13 14 15 16 17 18 19 20 2 3 2 2 1 2 2 2 2 2 2

Algoritmo:
K[0] 0; Para j de 1 a M: K[j] -1; Fp; Para i de 1 a t: Para j de W[i] a M: Se (K[j-W[i]] 0) e (K[j] = -1) Ento K[j] i; Fp; Fp;

0 -1 -1 2 -1 3

Programao Dinmica
Mochila outras verses
f) Mochila com mltiplos itens, cada um com peso e valor: a cada tem, alm do peso(p) associado um valor(v). O objetivo passa a ser determinar o valor mximo que pode comportar a mochila Ex: W = {(7,10), (3,6), (5,11),
(9,12), (15,15)} M = 20

Programao Dinmica
Mochila outras verses
f) Mochila com mltiplos itens, cada um com peso e valor: a cada tem, alm do peso(W) associado um valor(V). O objetivo passa a ser determinar o valor mximo que pode comportar a mochila Ex: W = {(7,10), (3,6), (5,11), (9,12), (15,15)} M = 20 Algoritmo:

10 11 12 13 14 15 16 17 18 19 20

0 -1 -1 2 -1 3 2 1 3 2 3 3 2 3 3 3 3 3 3 3 3 0 0 0 6 0 11 12 10 17 18 22 23 24 28 29 33 34 35 39 40 44 0 -1 -1 2 -1 3 -1 1 3 4 2 -1 3 -1 4 3 4 4 5 4 5 0 0 0 6 0 11 0 10 17 12 16 0 21 0 23 27 22 29 21 28 26

K[0].me 0; K[0].vm 0; Para j de 1 a M: K[j].me -1; K[j].vm 0; Fp; Para i de 1 a t: Para j de P[i] a M: Se (K[j-W[i]].me 0) e (K[j].vm < (K[j-W[i]].vm+V[i]) Ento K[j].me i; Fp; Fp; K[j].vm K[j-W[i]].vm+V[i];

(valores da verso 0/1)

Programao Dinmica
Mochila outras verses
g) Mochila com tens fracionveis: cada tem pode ser fracionado. Ser visto adiante (Guloso)

Programao Dinmica
Mochila PD x Backtracking -Muitos itens pequenos
S = {3, 3, 4, 7, 9, 15, 16, 55, 57, 58, 100, 111, 115, 125, 150, 201, 337, 442, 503, 712, 1111}

melhor PD
h) Mochila mista: parte dos itens no fracionveis e parte fracionveis. Ser visto adiante (PD+Guloso)

-Poucos itens grandes


S = {1.023, 19.992, 220.043, 401.327, 899.206, 1.203.427, 1.234.567.806, 2.997.200.025}

melhor BK

Programao Dinmica
Produto de Matrizes
Dada uma sequncia de matrizes que devem ser multiplicadas, determinar a ordem tima de multiplicao, considerando que o produto associativo.

Programao Dinmica
Produto de Matrizes Associatividade
M1(a x b) x M2(b x c) x M3(c x d)

Exemplo:
M1 (5 x 20) M2(20 x 50) M3(50 x 5) M4(5 x 100) O produto pode ser feito de inmeras maneiras, dentre as quais: ((M1 x M2) x (M3 x M4)) (M1 x ((M2 x M3) x M4))

a) ((M1 x M2) x M3) = M4(a x d), (M1 x M2) = M5 (a x c) M4ij = 1kc M5ik x M3kj = 1kc(1tb M1it x M2tk,) x M3kj = 1kc 1tb M1it x M2tk x M3kj b) (M1 x (M2 x M3)) = M4(a x d), (M2 x M3) = M6 (b x d) M4ij = 1tb M1it x M6tj = 1tb M1it (1kc M2itk x M3kj) = 1kc 1tb M1it x M2tk x M3kj

Programao Dinmica
Produto de Matrizes Quantidade de operaes
M1 (a x b) x M2(b x c) a x b x c produtos a x (b-1) x c somas M4(5 x 100)

Programao Dinmica
Produto de Matrizes Formulao recursiva
Vetor de dimenses: Mi (ri-1 x ri) 0 r0 1 r1 2 r2 ... ... ... ... n rn

Produto de Matrizes Mais de duas matrizes


M1 (5 x 20) M2(20 x 50) M3(50 x 5)

a) ((M1 x M2) x (M3 x M4)) 5 x 20 x 50 + 50 x 5 x 100 + 5 x 50 x 100 = = 55000 b) (M1 x ((M2 x M3) x M4)) 20 x 50 x 5 + 20 x 5 x 100 + 5 x 20 x 100 = = 25000

T[i, j] = nm. mnimo de operaes p/ obter Mi....Mj


T[i, j] = mini k <j{T[i, k]+T[k+1,j] + ri-1 x rk x rj} T[i, i] = 0

Programao Dinmica
Produto de Matrizes Implementao com PD
0 5 M1 1 20 M2 2 50 M3 3 5 M4 4 100

Programao Dinmica
Produto de Matrizes Implementao com PD
5 M1 20 1 1 2 3 4 0 0 0 M2 50 2 M3 M4 5 100 3 4

j i = 0

A idia calcular os produtos timos Mi....Mj em ordem crescente da diferena j i: T[1,1], T[2,2], T[3,3], T[4,4] T[1,2], T[2,3], T[3,4] T[1,3], T[2,4] T[1,4], a soluo buscada!

Programao Dinmica
Produto de Matrizes Implementao com PD
M1 M2 M3 M4
5 20 50 5 100

Programao Dinmica
Produto de Matrizes Implementao com PD
M1 M2 M3 M4
5 20 50 5 100

j i = 1

j i = 2
T[1,3] k = 1 T[1,1]+T[2,3]+r0.r1.r3 = 0 + 5000+5.20.5 = 5.500

1 1 2 3 4
0 -

2
5.000 0 -

4
1 2 25.000 0 3 4

1 0 -

5.000 5.500 0 5.000 0 25.000 0

5.000 0 -

k = 2 T[1,2]+T[3,3]+r0.r2.r3 = 0 + 5000+5.50.5 = 6.250

Programao Dinmica
Produto de Matrizes Implementao com PD
M1 M2 M3 M4
5 20 50 5 100 j i = 2
T[2,4] k = 2 T[2,2]+T[3,4]+r1.r2.r4 = 0 + 25000+20.50.100 = 125.000 k = 3 T[2,3]+T[4,4]+r1.r3.r4 = 5000 + 0+20.5.100 = 15.000

Programao Dinmica
Produto de Matrizes PD M1 M2 M3 M4
5 20 50 5 100

j i = 3

T[1,4] k = 1 T[1,1]+T[2,4]+r0.r1.r4 = 0 + 15000+5.20.100 = 25.000 k = 2 T[1,2]+T[3,4]+r0.r2.r4 = 5000 + 25000+5.50.100 = 55.000 k = 3 T[1,3]+T[4,4]+r0.r3.r4 = 5500 + 0+5.5.100 = 8.000

1 1 2 3 4 0 -

1 1 2 3 4 0 -

5.000 5.500 0 5.000 15.000 0 25.000 0

5.000 5.500 8.000 0 5.000 15.000 0 25.000 0

Programao Dinmica
Produto de Matrizes PD Custo
1 1 2 3 4 2 3 4 1 2 3 4 0 5.000 5.500 8.000 0 5.000 15.000 0 25.000 0 1 0 2 1 0 -

Programao Dinmica

Produto Matrizes
i k <j

Soluo
3 1 2 0 4 3 3 3 0

Melhor k

T[i, j] = min{T[i, k]+T[k+1,j] + ri-1 x rk x rj} T[i, i] = 0 Quer-se encontrar T[1, n].

Algoritmo:
Para k de 1 a n: T[k, k] 0; Fp; Para d de 1 a n 1: Para i de 1 n - d: j i + d; T[i, j] ; Para k de i at j 1: Se ((T[i, k] + T[k+1, j] + r[i-1].r[k].r[j]) < T[i, j]) Ento T[i, j] T[i, k] + T[k+1, j] + r[i-1].r[k].r[j]; MK[i, j] k; Fp; Fp; Fp;

Multiplicao tima: ((M1 x (M2 x M3)) x M4)

Complexidade: O(n3)

Programao Dinmica
Produto de Matrizes
M1
5 20

Programao Dinmica

Produto Matrizes

M2
50

M3
5

M4
100

Impresso da expresso: baseada em uma recorrncia sobre a matriz MK

Algoritmo:
Expressao(i,j) { retorna String } Se (i = j) Ento Retornar 'M' + i; Seno Retornar '(' + Expressao(i,MK[i,j])+ 'x' + Expressao(MK[i,j]+1,j) + ')'; Fim;

Exerccio: Calcular a pior maneira de multiplicar as matrizes acima.

Programao Dinmica
Distncia de Edio
Dados dois strings A e B, quer-se determinar a menor sequncia de operaes p/ transformar A em B. Os tipos de operao so: -insero de um caracter -deleo de um caractr -substituio de um caractr Exemplo: ERRO transforma-se em mediante 3 operaes: -insero do A -insero do C -substituio do R ACERTO AERRO ACERRO ACERTO

Programao Dinmica
Distncia de Edio - Formulao recursiva
Dados os substrings Ai (primeiros i caracteres) e Bj, D(i, j) = distncia de edio entre Ai e Bj = D(i-1, j-1), se ai = bj min(D(i-1, j), D(i, j-1), D(i-1, j-1)) + 1, se ai bj

Deleo de ai

Insero de bj

Substituio de ai por bj

Programao Dinmica
Clculo da Distncia de Edio
0 0 1 E 2 R 3 R 4 O
0 1 2 3 4

Programao Dinmica
Distncia de Edio
D(i, j) = D(i-1, j-1) = 0, se ai = bj min(D(i-1, j), D(i, j-1), D(i-1, j-1)) + 1, se ai bj

1 A
1 1 2 3 4

2 C
2 2 2 3 4

3 E
3 2 3 3 4

4 R
4 3 2 3 4

5 T
5 4 3 3 4

6 O
6 5 4 4 3

Algoritmo:
Para i de 0 a n: D[i, 0] i; Fp; Para i de 0 a m: D[0, i] i; Fp; Para i de 1 a n: Para j de 1 a m: Se (A[i] = B[j]) Ento s 0 Seno s 1; D[i, j] min(D[i-1, j-1]+s, D[i-1, j]+1, D[i, j-1] +1); Fp; Fp; Complexidade: O(n.m)

Distncia de Edio - Apresentando a transformao


0 0 1 E 2 R 3 R 4 O
0 1 2 3 4

Programao Dinmica

Distncia de Edio - Apresentando a transformao


6 O
6 5 4 4 3

Programao Dinmica
1 M
1 1 1 2 3 4

1 A
1 1 2 3 4

2 C
2 2 2 3 4

3 E
3 2 3 3 4

4 R
4 3 2 3 4

5 T
5 4 3 3 4

0 0 1 A 2 M 3 O 4 R 5 A
0 1 2 3 4 5

2 A
2 1 2 2 3 3

3 R
3 2 2 3 2 3

4 R
4 3 3 3 3 3

5 O
5 4 4 3 4 4

6 M
6 5 4 4 4 5

Programao Dinmica
Distncia de Edio

Programao Dinmica
Exerccio 1a) Resolver intuitivamente o seguinte problema:

Exerccio: Determinar a distncia de edio do seu ALSTRING(8 letras iniciais do nome) para o do colega. Mostrar duas transformaes mnimas do primeiro string para o segundo.

Qual o valor mximo possvel da soma dos nmeros obtidos pela concatenao dos dgitos do particionamento do vetor de dgitos em segmentos consecutivos de 1 a 3 dgitos? 2 6 3 1 7 8 9 0 9 5

Programao Dinmica
Exerccio 1b) Escrever uma recorrncia para o problema: Qual o valor mximo possvel da soma dos nmeros obtidos pela concatenao dos dgitos do particionamento do vetor de dgitos em segmentos consecutivos de 1 a 3 dgitos? 2 6 3 1 7 8 9 0 9 5

Programao Dinmica
Exerccio 1c) Escrever um algoritmo de PD para o problema: Qual o valor mximo possvel da soma dos nmeros obtidos pela concatenao dos dgitos do particionamento do vetor de dgitos em segmentos consecutivos de 1 a 3 dgitos? 2 6 3 1 7 8 9 0 9 5

Programao Dinmica
Exerccio 1d) Escrever um algoritmo de PD para o problema: Qual a maneira de particionar um vetor de dgitos em parties de 1 a 3 dgitos, tal que a soma dos nmeros resultantes da concatenao dos dgitos de cada partio seja mxima? 2 6 3 1 7 8 9 0 9 5

Programao Dinmica
Exerccio 1- Soluo
0 0
0

1 2
2

2 6
26

3 3
263

4 1
633

5 7
640

6 8
711

7 9 4

8 0 5

9 9 6

10 5 8

1422 1530 1620 1625

1625 = 2 631 7 890 95

Programao Dinmica
Exerccio 2a) Escrever a recorrncia que indica o nmero de caminhos mnimos distintos entre os pontos (1,1) e (n,m) em um grid de dimenses n x m, onde h obstculos em alguns pontos de cruzamento (no mximo n-1 obstculos).
1,1

Programao Dinmica
Exerccio 2
b) Escrever um algoritmo de PD para a formulao anterior.
1,1

4,6 4,6

Programao Dinmica
Exerccio 2
c) Mostrar o preenchimento da matriz para o exemplo abaixo.
1,1

Programao Dinmica
Exerccio 3a) Escrever mnimo de obtidos com dimenses a a recorrncia que indica o nmero quadrados, T(a,b) que podem ser cortes transversais em uma chapa de x b.
Exemplo: a = 5, b=6

4,6

Programao Dinmica
Exerccio 3b) Escrever um algoritmo de PD para o problema descrito.
Exemplo: a = 5, b=6

Programao Dinmica
Exerccio 3c) Preencher a matriz 6 x 6 relativa ao exemplo.
Exemplo: a = 5, b=6

Programao Dinmica

FIM

Você também pode gostar