Upload
diiego2
View
5
Download
0
Embed Size (px)
DESCRIPTION
Programação Dinâmica
Citation preview
Programao Dinmica
fib(1) fib(0)
fib(2) fib(1)
fib(3)
fib(1) fib(0)
fib(2)
fib(4)
fib(1) fib(0)
fib(2) fib(1)
fib(3)
fib(5)
Programao DinmicaUma metodologia de resoluo de problemas
Pedro Ribeiro
Center for Research in Advanced Computing Systems (CRACS & INESC-Porto LA)
Departamento de Cincia de ComputadoresFaculdade de Cincias da Universidade do Porto
Contedo
Motivao e conceitos base Exemplos iniciais e clculos repetidos
Programao Dinmica Definio
Caractersticas de um problema de PD
Passos para chegar a uma soluo
Pedro Ribeiro
Exemplos de aplicao PD clssica, de contagem, com jogos e mais complexa
2Programao Dinmica
Nmeros de Fibonacci
Sequncia de nmeros muito famosa definida por Leonardo Fibonacci
0,1,1,2,3,5,8,13,21,34,...
F(0) = 0F(1) = 1
Pedro Ribeiro
F(1) = 1F(n) = F(n-1) + F(n-2)
3Programao Dinmica
Nmeros de Fibonacci
Como implementar?
Implementao directa a partir da Implementao directa a partir da definio:fib(n):
Se n=0 ou n=1 entoretornar n
Seno
Pedro Ribeiro
Pontos negativos desta implementao?
4Programao Dinmica
Senoretornar fib(n-1) + fib(n-2)
Nmeros de Fibonacci
Clculos de fib(5)
fib(5)
fib(2) fib(1)
fib(3)
fib(1) fib(0)
fib(2)
fib(4)
fib(1) fib(0)
fib(2) fib(1)
fib(3)
Pedro Ribeiro5Programao Dinmica
fib(1) fib(0)
fib(2) fib(1) fib(1) fib(0) fib(1) fib(0)
Nmeros de Fibonacci
Clculos de fib(5)
fib(5)
fib(2) fib(1)
fib(3)
fib(1) fib(0)
fib(2)
fib(4)
fib(1) fib(0)
fib(2) fib(1)
fib(3)
Pedro Ribeiro
Por exemplo, fib(2) chamado 3 vezes!6Programao Dinmica
fib(1) fib(0)
fib(2) fib(1) fib(1) fib(0) fib(1) fib(0)
Nmeros de Fibonacci
Como melhorar? Por exemplo, comeando do zero e mantendo sempreem memria os dois ltimos nmeros da sequncia
fib(n):Se n=0 ou n=1 ento
retornar nSeno
f1 = 1f2 = 0Para i: 2 at n fazer
Pedro Ribeiro7Programao Dinmica
Para i: 2 at n fazerf = f1 + f2f2 = f1f1 = f
retornar f
Nmeros de Fibonacci
Conceitos a reter: Diviso de um problema em subproblemas do
mesmo tipomesmo tipo
Calcular o mesmo subproblema apenas uma vez
Ser que estas ideias podem tambm
Pedro Ribeiro
Ser que estas ideias podem tambm ser usadas noutros problemas mais complicados?
8Programao Dinmica
Pirmide de Nmeros
Problema clssico das Olimpadas Internacionais de Informtica de 1994
Calcular a rota, que comea no topo da pirmide e acaba na base, com maior soma . Em cada passo podemos
Problema
Pedro Ribeiro9Programao Dinmica
maior soma . Em cada passo podemos ir diagonalmente para baixo e para a esquerda ou para baixo e para a direita.
Pirmide de Nmeros
Duas possveis rotas
Pedro Ribeiro
Limites: todos os nmeros da pirmide so inteiros entre 0 e 99 e o nmero de linhas do tringulo no mximo 100.
10Programao Dinmica
Soma = 21 Soma = 30
Pirmide de Nmeros
Como resolver o problema?
Ideia: Fora Bruta!
avaliar todos os caminhos possveis e ver qual o melhor.
Pedro Ribeiro
Mas quanto tempo demora isto?
Quantos caminhos existem?
11Programao Dinmica
Pirmide de Nmeros
Anlise da complexidade Em cada linha podemos tomar duas decises diferentes: esquerda ou direita
Seja n a altura da pirmide. Uma rota constituda por n1 decises diferentes.
Existem 2n-1 caminhos diferentes. Ento, um programa que calculasse todas rotas teria complexidade temporal O(2n): crescimento exponencial!
Note-se que 2996,34x1029, que um nmero
Pedro Ribeiro
Note-se que 2 6,34x10 , que um nmero demasiado grande!
12Programao Dinmica
633825300114114700748351602688
Pirmide de Nmeros
Quando estamos no topo da pirmide, temos duas decises possveis (esquerda ou direita):
Em cada um dos casos, temos de ter em conta
Pedro Ribeiro
Em cada um dos casos, temos de ter em conta todas as rotas das respectivas subpirmides assinaladas a amarelo.
13Programao Dinmica
Pirmide de Nmeros
Mas o que nos interessa saber sobre estas subpirmides?
Apenas interessa o valor da sua melhor rota interna (que um instncia mais pequena do mesmo problema)!
Pedro Ribeiro
interna (que um instncia mais pequena do mesmo problema)!
Para o exemplo, a soluo 7 mais o mximo entre o valor da melhor rota de cada uma das subpirmides
14Programao Dinmica
Pirmide de Nmeros
Ento este problema pode ser resolvido recursivamente. Seja P[i][j] o j-simo nmero da i-sima linha
Seja Max(i,j) o melhor que conseguimos a partir da posio i,j
1 2 3 4 5
1 7
2 3 8
Pedro Ribeiro15Programao Dinmica
2 3 8
3 8 1 0
4 2 7 4 4
5 4 5 2 6 5
Pirmide de Nmeros
Ento:Max(i,j):
Se i = n entoMax(i,j) = P[i][j]
1 2 3 4 5
1 7
2 3 8
Max(i,j) = P[i][j] Seno
Max(i,j) = P[i][j] + mximo(Max(i+1,j), Max(i+1,j+1))
Pedro Ribeiro16Programao Dinmica
2 3 8
3 8 1 0
4 2 7 4 4
5 4 5 2 6 5
Para resolver o problemabasta chamar Max(1,1)
Pirmide de Nmeros
Continuamos com crescimento exponencial!
Max(2,1) Max(2,2)
Max(1,1)
Estamos a avaliar o mesmo subproblema vrias vezes!
...
Max(4,1)
...
Max(4,2)
Max(3,1)
...
Max(4,2)
...
Max(4,3)
Max(3,2)
...
Max(4,2)
...
Max(4,3)
Max(3,2)
...
Max(4,3)
...
Max(4,4)
Max(3,3)
Pedro Ribeiro
vezes!
17Programao Dinmica
Pirmide de Nmeros
Temos de reaproveitar o que j calculamos S calcular uma vez o mesmo subproblema!
Ideia: criar uma tabela com o valor obtido para cada subproblema! Matriz M[i][j]
Pedro Ribeiro
Ser que existe uma ordem para preencher a tabela de modo a que quando precisamos de um valor j o temos?
18Programao Dinmica
Pirmide de Nmeros
Comear a partir do fim!
Pedro Ribeiro19Programao Dinmica
Pirmide de Nmeros
Comear a partir do fim!
Pedro Ribeiro20Programao Dinmica
4 5 2 6 5
Pirmide de Nmeros
Comear a partir do fim!
7 12 10 10
Pedro Ribeiro21Programao Dinmica
4 5 2 6 5
7 12 10 10
Pirmide de Nmeros
Comear a partir do fim!
30
7 12 10 10
20 13 10
23 21
Pedro Ribeiro22Programao Dinmica
4 5 2 6 5
7 12 10 10
Pirmide de Nmeros
Tendo em conta a maneira como preenchemos a tabela, at podemos aproveitar P[][]!
Calcular ():Para i: n-1 at 1 fazer
Com isto soluo fica em P[1][1]!
Para i: n-1 at 1 fazerPara j: 1 at i fazer
P[i][j] = P[i][j] + mximo(P[i+1][j], P[i+1][j+1])
Pedro Ribeiro
Agora, o tempo necessrio para resolver o problema j s cresce polinomialmente ( O(n2) ) e j temos uma soluo admissvel para o problema (992=9801)
23Programao Dinmica
Pirmide de Nmeros
Se fosse necessrio saber constituio da melhor soluo? Basta usar a tabela j calculada!
20 13 10
23 21
30
Pedro Ribeiro24Programao Dinmica
4 5 2 6 5
7 12 10 10
20 13
Pirmide de Nmeros
Para resolver o problema da pirmide de nmeros usamosnmeros usamos
Programao Dinmica(PD)
Pedro Ribeiro25Programao Dinmica
(PD)
Programao Dinmica (PD)
Definio (adaptado de NIST-DADSP*):
uma tcnica algortmica, normalmente usada em problemas de optimizao, que baseada em guardar os resultados de subproblemas, em em guardar os resultados de subproblemas, em vez de os recalcular.
Tcnica algortmica: mtodo geral para resolver problemas que tm algumas caractersticas em comum
Problema de optimizao: quando se pretende encontrar a melhor soluo entre todas as solues admissveis, mediante
Pedro Ribeiro
melhor soluo entre todas as solues admissveis, mediante um determinado critrio (funo objectivo).
26Programao Dinmica
* NIST National Institute of Standarts and TechnologyDADSP Dictionary of Algorithms, Data Structures, and Problems
Clssica troca de espao por tempo
PD - Caractersticas
Quais so ento as caractersticas que um problema deve apresentar para um problema deve apresentar para poder ser resolvido com PD?
Subestrutura ptima
Subproblemas coincidentes
Pedro Ribeiro
Subproblemas coincidentes
27Programao Dinmica
Subestrutura ptima (optimal substructure):
Quando a soluo ptima de um problema contm nela prpria solues ptimas para
PD - Caractersticas
contm nela prpria solues ptimas para subproblemas do mesmo tipo.
Quando um problema apresenta esta
Exemplo: No problema das pirmides de nmeros, a soluo ptima contm nela prpria os melhores percursos de subpirmides, ou seja, solues ptimas de subproblemas.
Pedro Ribeiro
Quando um problema apresenta esta caracterstica diz-se que ele respeita o princpio de optimalidade
(optimality principle).
28Programao Dinmica
PD - Caractersticas
Subestrutura ptima (optimal substructure):
preciso ter cuidado porque isto nem sempre acontece!acontece!
Exemplo: se, no problema das pirmides, o objectivo fosse encontrar a rota que maximizasse o resto da diviso inteira entre 10 e o valor dessa rota.
Pedro Ribeiro29Programao Dinmica
1
5 55 4 5
15 5
5 4 5
A soluo ptima (155) no contm a soluo ptima para a subpirmide assinalada a amarelo (54)
PD - Caractersticas
Subproblemas coincidentes:
Quando um espao de subproblemas pequeno, isto , no so muitos os subproblemas a resolver pois muitos deles so exactamente iguais uns aos outros.deles so exactamente iguais uns aos outros.
Tambm esta caracterstica nem sempre acontece, quer porque mesmo com subproblemas coincidentes so muitos subproblemas
Exemplo: no problema das pirmides, para um determinada instncia do problema, existem apenas n+(n-1)+...+1
PD - Metodologia
Se um problema apresenta estas duas caractersticas, temos uma boa pista de que a PD se pode aplicar. No pista de que a PD se pode aplicar. No entanto, nem sempre isso acontece.
Que passos devemos ento tomar se
Pedro Ribeiro
Que passos devemos ento tomar se quisermos resolver um problema usando PD?
31Programao Dinmica
PD - Metodologia
(nota: estes passos representam apenas
um guia de resoluo)
1) Caracterizar a soluo ptima do problema1) Caracterizar a soluo ptima do problema
2) Definir recursivamente a soluo ptima, em funo de solues ptimas de subproblemas
3) Calcular as solues de todos os subproblemas: de trs para a frente ou
Pedro Ribeiro
subproblemas: de trs para a frente ou com memoization
4) Reconstruir a soluo ptima, baseada nos clculos efectuados (opcional)
32Programao Dinmica
PD - Metodologia
1) Caracterizar a soluo ptima de um problema Compreender bem o problema
Verificar se um algoritmo que verifique todas as solues fora bruta no suficiente
Tentar generalizar o problema ( preciso prtica para perceber como generalizar da maneira correcta)
Procurar dividir o problema em subproblemas do mesmo tipo
Pedro Ribeiro
mesmo tipo
Verificar se o problema obedece ao princpio de optimalidae
Verificar se existem subproblemas coincidentes
33Programao Dinmica
PD - Metodologia
2) Definir recursivamente a soluo ptima, em funo de solues ptimas de subproblemas.
Definir recursivamente o valor da soluo ptima, com rigor e exactido, a partir de subproblemas mais pequenos do mesmo tipo
Imaginar sempre que os valores das solues ptimas j esto disponveis quando precisamos
Pedro Ribeiro
ptimas j esto disponveis quando precisamos deles
No necessrio codificar. Basta definir matematicamente a recurso.
34Programao Dinmica
PD - Metodologia
3) Calcular as solues de todos os subproblemas: de trs para a frente
Descobrir a ordem em que os subproblemas so precisos, a partir dos subproblemas mais pequenos at chegar ao problema global (bottom-up) e codificar, usando uma tabela.
Normalmente, esta ordem inversa ordem normal da funo recursiva que resolve o problema
Pedro Ribeiro
funo recursiva que resolve o problema
.
35Programao Dinmica
Incio Fim
Ordem de optimizao usando programao dinmica
Ordem normal de resoluo
PD - Metodologia
3) Calcular as solues de todos os subproblemas: memoization
Existe uma tcnica, chamada memoization, que permite resolver o problema pela ordem normal (top-down)
Usar a funo recursiva obtida directamente a partir definio da soluo e ir mantendo uma tabela com
Pedro Ribeiro
definio da soluo e ir mantendo uma tabela com os resultados dos subproblemas.
Quando queremos aceder a um valor pela primeira vez temos de calcul-lo e a partir da basta ver qual .
36Programao Dinmica
PD - Metodologia
4) Reconstruir a soluo ptima, baseada nos clculos efectuados
Pode ou no ser requisito do problema
Duas alternativas: Directamente a partir da tabela dos sub-problemas
Nova tabela que guarda as decises em cada etapa
Pedro Ribeiro
Nova tabela que guarda as decises em cada etapa
No necessitando de saber qual a melhor soluo, podemos por vezes poupar espao
37Programao Dinmica
Exemplo Subsequncia crescente
Dada uma sequncia de nmeros inteiros:
7, 6, 10, 3, 4, 1, 8, 9, 5, 27, 6, 10, 3, 4, 1, 8, 9, 5, 2
Descobrir qual a maior subsequncia crescente (no necessariamente contgua)
7, 6, 10, 3, 4, 1, 8, 9, 5, 2 Tamanho 2
Pedro Ribeiro
7, 6, 10, 3, 4, 1, 8, 9, 5, 2 Tamanho 2
7, 6, 10, 3, 4, 1, 8, 9, 5, 2 Tamanho 3
7, 6, 10, 3, 4, 1, 8, 9, 5, 2 Tamanho 4
38Programao Dinmica
Exemplo Subsequncia crescente
1. Caracterizar soluo ptima Seja N o tamanho da sequncia, e num[i] o i-simo nmero
Fora bruta, quantas opes? (binomial theorem: 2n-1)
Generalizar e resolver com subproblemas iguais: seja best(i) o valor da melhor subsequncia a partir da
i-sima posio
Caso fcil: a melhor subsequncia a comear da ltima posio tem tamanho 1!
Caso geral
Pedro Ribeiro
Caso geral: para um dado i, podemos seguir para todos os nmeros entre i+1 e N, desde que sejam maiores
39Programao Dinmica
7, 6, 10, 3, 4, 1, 8, 9, 5, 2
Exemplo Subsequncia crescente
1) Caracterizar soluo ptima Caso geral: para um dado i, podemos seguir para
todos os nmeros entre i+1 e N, desde que sejam maioresmaiores Para esses nmeros, basta-nos saber o melhor a partir
da! (princpio da optimalidade)
O melhor a partir de uma posio necessrio para calcular todas as posies de ndice inferior! (subproblemas coincidentes)
Pedro Ribeiro40Programao Dinmica
7, 6, 10, 3, 4, 1, 8, 9, 5, 2
Exemplo Subsequncia crescente
2) Definir soluo recursiva em funo de solues ptimas de subproblemas
N tamanho da sequncia
num[i] nmero na posio i
best(i) melhor subsequncia a partir da posio i
best(N) = 1
Pedro Ribeiro41Programao Dinmica
best(N) = 1
best(i) = 1 + mximo{best(j): inum[i]}para 1i
Exemplo Subsequncia crescente
3) Calcular soluo ptima: trs para a frente Seja best[] tabela para guardar valores de best()
Calcular ():Calcular ():best[N] = 1Para i: n-1 at 1 fazer
best[i] = 1Para j: i+1 at N fazer
Se num[j]>num[i] e 1+best[j]>best[i] entobest[i] = 1+best[j]
Pedro Ribeiro42Programao Dinmica
i 1 2 3 4 5 6 7 8 9 10
num[i] 7 6 10 3 4 1 8 9 5 2
best[i] 3 3 1 4 3 3 2 1 1 1
Exemplo Subsequncia crescente
4) Reconstruir soluo Exemplo de tabela auxiliar com decies
Seja next[i] a prxima posio para obter o melhor a partir da posio i (X se a ltima da sequncia)
i 1 2 3 4 5 6 7 8 9 10
num[i] 7 6 10 3 4 1 8 9 5 2
Pedro Ribeiro43Programao Dinmica
num[i] 7 6 10 3 4 1 8 9 5 2
best[i] 3 3 1 4 3 3 2 1 1 1
next[i] 7 7 X 5 7 7 8 X X X
Exemplo Obras na estrada
Cidade com quadriculado de ruas (MIUP2004) Algumas estradas tm obras
S se pode andar para norte e para este
N mximo: 30
Pedro Ribeiro44Programao Dinmica
N mximo: 30
De quantas maneiras diferentes se pode ir de (x1,y1) para (x2,y2) ?
Exemplo Obras na estrada
1) Caracterizar o problema Fora bruta? (com N=30, existem ~1,2x1017 caminhos)
X
Ir de (x1,y1) para (x2,y2): pode ignorar-setudo o que est fora desse rectngulo
Nmero de maneiras a partir de uma posio igual ao nmero de maneiras desde a posio a norte mais o nmero de maneiras desde a posio a este!
Subproblema igual com soluo no dependente do problema maior (equivalente a princpio da optimalidade)
X
Pedro Ribeiro
maior (equivalente a princpio da optimalidade)
Existem muitos subproblemas coincidentes!
45Programao Dinmica
X
X
X
X
X
X
X
X
Exemplo Obras na estrada
2) Definir soluo recursiva
L nmero de linhas
C nmero de colunas
count(i,j) nmero de maneiras a partir de posio (i,j)
obra(i,j,D) valor V/F indicando se existe obra a impedir deslocao de (i,j) na direco D (NORTE ou ESTE)
count(L,C) = 1
count(i,j) = valor_norte(i,j) + valor_este(i,j)para (i,j)(L,C)onde:
Pedro Ribeiro46Programao Dinmica
onde:valor_norte(i,j): 0 se (j=L ou obra(i,j,NORTE))
count(i+1,j) caso contrrio
valor_este(i,j): 0 se (j=L ou obra(i,j,ESTE))count(i,j+1) caso contrrio
Exemplo Obras na estrada
3) Calcular soluo ptima: trs para a frente
Calcular ():Inicializar count[][] com zeroscount[L][C] = 1count[L][C] = 1Para i: L at 1 fazer
Para j: C at 1 fazerSe i
Exemplo Jogo de Pedras
Existem N pedras numa mesa Dois jogadores
Em cada jogada retira-se 1, 3 ou 8 pedras(generalizvel para qualquer nmero de peas)
Quem retirar as ltimas pedras ganha o jogo!
Pergunta: dado o nmero de pedras, o jogador que
comea a jogar pode garantidamente ganhar?
Exemplo:15 pedras na mesa:jogador A retira 8
Pedro Ribeiro48Programao Dinmica
15 pedras na mesa:jogador A retira 87 pedras na mesa: jogador B retira 34 pedra na mesa: jogador A retira 13 pedras na mesa: jogador B retira 30 pedras na mesa: ganhou jogador B!
Exemplo Jogo de Pedras
1) Caracterizar soluo ptima Soluo bruta: avaliar todos jogos possveis! O(3^N)
Como generalizar? Seja win(i) um valor V/F representando se com i pedras conseguimos ganhar(posio ganhadora)
Claramente win(1), win(3) e win(8) so verdadeiras
E para os outros casos? Se a nossa jogada for dar a uma posio ganhadora,
Pedro Ribeiro
Se a nossa jogada for dar a uma posio ganhadora, ento o adversrio pode forar a nossa derrota
Ento, a nossa posio ganhadora se conseguirmos chegar a uma posio que no o seja!
Caso todas as jogadas forem dar a posies ganhadoras, a nossa posio perdedora
49Programao Dinmica
Exemplo Jogo de Pedras
2) Definir soluo recursiva em funo de solues ptimas de subproblemas
N nmero de pedras
win[i] valor V/F indicando se estar com i pedras estar numa posio ganhadora
win(0) = falso
Pedro Ribeiro50Programao Dinmica
win(i) = verdadeiro se ~win[i-1] ou ~win[i-3] ou ~win[i-8]falso caso contrrio
para 1iN
Exemplo Jogo de Pedras
3) Calcular soluo ptima: trs para a frente
Calcular ():Para i: 0 at N fazer
Se (i1 e no(win[i-1])) ouSe (i1 e no(win[i-1])) ou(i3 e no(win[i-3])) ou(i8 e no(win[i-8])) ento
win[i] = trueSeno
win[i] = false
Pedro Ribeiro51Programao Dinmica
i 0 1 2 3 4 5 6 7 8 9 10 11 12
win[i] F V F V F V F V V V V F V
Exemplo Distncia de Edio
Vamos a um ltimo exemplo um pouco mais complexo
Problema: consideremos duas palavras pal1 e pal2. O nosso objectivo transformar pal1 em pal2 usando apenas trs tipos de transformaes:
1 2
apenas trs tipos de transformaes:1) Apagar uma letra2) Introduzir uma nova letra3) Substituir uma letra por outra
Qual o mnimo nmero de transformaes que temos de fazer para transformar uma palavra na outra? Chamemos a esta medida distncia de edio (de).
Pedro Ribeiro
Chamemos a esta medida distncia de edio (de).
Exemplo: para transformar gotas em afoga precisamos de quatro transformaes:
(1) (3) (3) (2)
gotas gota_ fota foga afoga
52Programao Dinmica
Exemplo Distncia de Edio
1) Caracterizar soluo ptima
Seja de(a,b) a distncia de edio entre as palavras a e b. Seja uma palavra vazia
Existem alguns casos simples? Claramente de(, ) zero.
de(,b), para qualquer palavra b? o tamanho da palavra b (porque temos de fazer inseres)
de(a, ) para qualquer palavra a? o tamanho da
Pedro Ribeiro
de(a, ) para qualquer palavra a? o tamanho da palavra a pois temos de apagar todas as letras de a.
E nos outros casos? Temos de tentar dividir o problema por etapas, onde decidimos de acordo com subproblemas
53Programao Dinmica
Exemplo Distncia de Edio
Nenhuma das palavras vazia
Como podemos igualar o final das duas palavras?
Seja la a ltima letra de a e a o resto da palavra (do mesmo modo definimos l e b).modo definimos lb e b).
Se la = lb ento s nos falta descobrir a distncia de edio entre a e b (que uma instncia mais pequena do mesmo problema!).
Caso contrrio podemos fazer trs operaes:
Substituir la por lb. Gastamos uma operao e precisamos de saber a distncia de edio entre a e b.
Pedro Ribeiro
distncia de edio entre a e b.
Apagar la. Gastamos uma operao e precisamos de saber a distncia de edio entre a e b.
Inserir lb no final de a. Gastamos uma operao e precisamos de saber a distncia de edio entre a e b.
54Programao Dinmica
Exemplo Distncia de Edio
2) Definir soluo recursiva|a| e |b| comprimentos das palavras a e b
a[i] e b[i] letra na posio i a palavra a e b
de(i,j) distncia de edio entre as palavras formadas pelas primeiras i letras de a e as primeiras j letras de b
de(i,0) = i, para 0 i |a|de(0,j) = j, para 0 j |b|
de(i,j) = min(de(i-1,j-1) + {0 se a[i]=b[i], 1 se a[i]b[i]},
Pedro Ribeiro55Programao Dinmica
de(i,j) = min(de(i-1,j-1) + {0 se a[i]=b[i], 1 se a[i]b[i]},de(i-1,j)+1,de(i,j-1)+1),
para 1 i |a| e 1 j |b|
Exemplo Distncia de Edio
Calcular solues de trs para a frente
Calcular ():Para i: 0 at |a| fazer de[i][0] = iPara i: 0 at |a| fazer de[i][0] = iPara j: 0 at |b| fazer de[0][j] = j
Para i: 1 at |a| fazerPara j: 1 at |b| fazer
Se a[i]=b[j] ento valor = 0Seno valor = 1de[i][j] = min( de[i-1][j-1]+value,
Pedro Ribeiro56Programao Dinmica
de[i][j] = min( de[i-1][j-1]+value,de[i-1][j],de[i-1][j] )
Exemplo Distncia de Edio
Vejamos a tabela a distncia de edio entre gotas eafoga:
de(i,0) = i, para 0 i |a|de(0,j) = j, para 0 j |b|
de(i,j) = min(de(i-1,j-1) +{0 se a[i]=b[i], 1 se a[i]b[i]},
j 0 1 2 3 4 5
i A F O G A
0 0 1 2 3 4 5
1 G 1 1 2 3 3 4
2 O 2 2 2 2 3 4
Pedro Ribeiro57
Programao Dinmica
{0 se a[i]=b[i], 1 se a[i]b[i]},de(i-1,j)+1,de(i,j-1)+1),
para 1i|a| e 0j |b|
O 2 2 2 2 3 4
3 T 3 3 3 3 3 4
4 A 4 3 4 4 4 3
5 S 5 4 4 5 5 4
j 0 1 2 3 4 5
i A F O G A
Se fosse preciso reconstruir a soluo?
Exemplo Distncia de Edio
0 0 1 2 3 4 5
1 G 1 1 2 3 3 4
2 O 2 2 2 2 3 4
3 T 3 3 3 3 3 4
Inserir letra
Apagar letra
Substituir letra
Pedro Ribeiro
T 3 3 3 3 3 4
4 A 4 3 4 4 4 3
5 S 5 4 4 5 5 4Manter letra
58Programao Dinmica
gotas gota_ gogafoga afogagfoga afoga
Concluso
Nem sempre a PD representa a melhor soluo para um problema, mas no entanto apresenta normalmente ganhos muito significativos sobre algoritmos exponenciais de fora-bruta;
A PD uma tcnica activamente usada na vida real, tanto no meio empresarial, como no meio acadmico;
A ideia base da PD muito simples, mas, como foi visto neste ltimo problema, nem sempre fcil chegar sua soluo. Quanto a mim, a parte mais difcil generalizar o problema da maneira correcta, de modo a podermos escrever
Pedro Ribeiro
soluo. Quanto a mim, a parte mais difcil generalizar o problema da maneira correcta, de modo a podermos escrever a soluo em funo de solues ptimas de subproblemas;
S existe uma maneira de dominar a PD: treinar, treinar, treinar!
59Programao Dinmica
Fim
http://www.dcc.fc.up.pt/~pribeiro/
[email protected]@dcc.fc.up.pt
Pedro Ribeiro60Programao Dinmica