Beruflich Dokumente
Kultur Dokumente
Programação Dinâmica
1
Wladimir Araújo Tavares
30 de março de 2017
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 1 / 50
1 Programação Dinâmica
2 Programação Dinâmica 1D
3 Programação Dinâmica 2D
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 2 / 50
O que é programação dinâmica?
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 3 / 50
Passos para resolver problemas de PD
Definir os subproblemas
Escrever a relação de recorrência que relaciona os subproblemas
Reconhecer e resolver os casos bases
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 4 / 50
1 Programação Dinâmica
2 Programação Dinâmica 1D
3 Programação Dinâmica 2D
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 5 / 50
Coin Change
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 6 / 50
Coin Change
Definir subproblemas
I Seja Dn o número de maneira de escrever n como a soma de 1, 3 e 4
Encontre a recorrência
I Considere um possı́vel solução n = x1 + . . . + xm
I Se xm = 1 então a soma do resto dos termos é n-1.
I Assim, todas as somas (n = x1 + . . . + xm ) terminadas com xm = 1 é
igual a Dn−1
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 7 / 50
Coin Change
Encontre a recorrência
I Dn = Dn−1 + Dn−3 + Dn−4
Resolver os casos bases
I D0 = 1
I D1 = D2 = 1
I D3 = 2
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 8 / 50
Implementação
D[ 0 ] = D[ 1 ] = D[ 2 ] = 1;
D[ 3 ] = 2;
f o r ( i n t i = 4 ; i <= n ; i ++){
D[ i ] = D[ i −1] + D[ i −3] + D[ i − 4 ] ;
}
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 9 / 50
LIS
Problema: Dado uma sequência a[0 . . . n − 1], encontre a maior
subsequência crescente de a.
Exemplo: a[] = {2,5,3,8,4,6}.
Subsequência crescente de a
2
2,5
2,5,8
2,5,6
2,3,8
2,3,4
2,3,4,6
5
5,8
5,6
..
.
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 10 / 50
LIS
Definir subproblemas
I Seja Ci o tamanho da maior subsequência crescente de a[0 . . . i] que
contém ai como último elemento.
Encontre a recorrência
I Ci = max{Cj + 1|aj < ai , 0 ≤ j ≤ i}
Resolva os casos bases
I C0 = 1
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 11 / 50
Implementação
C[0] = 1;
for ( int i = 1; i < n ; i ++){
C[ i ]=1;
for ( int j = 0 ; j < i ; j ++){
if ( a[ j ] < a[ i ])
C[ i ] = C [ i ] > C [ j ]+1 ? C [ i ] : C [ j ] + 1 ;
}
}
ans = 0 ;
for ( int i = 0; i < n ; i ++) a n s = a n s > C [ i ] ? a n s : C [ i ] ;
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 12 / 50
Implementação
s e t <i n t > s t ;
s e t <i n t > : : i t e r a t o r it ;
st . clear ();
f o r ( i n t i = 0 ; i < n ; i ++){
st . insert (a [ i ] ) ;
i t = st . find (a [ i ] ) ;
i t ++;
i f ( i t != s t . end ( ) )
st . erase ( i t );
}
ans = s t . s i z e ( ) ;
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 13 / 50
1 Programação Dinâmica
2 Programação Dinâmica 1D
3 Programação Dinâmica 2D
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 14 / 50
LCS
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 15 / 50
LCS
Defina os subproblemas
I Seja Dij o comprimento da LCS de x[1 . . . i] e y [1 . . . j]
Encontre a recorrência
I Se xi = yj , então o caractere está na LCS
F Dij = Di−1,j−1 + 1
I Caso contrário, xi ou yj não contribuem para o LCS, então ele pode ser
removido
F Dij = max(Di−1,j , Di,j−1 )
Resolva os casos bases:
I Di0 = D0j = 0
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 16 / 50
Implementação
i n t D[ 1 0 0 1 ] [ 1 0 0 1 ] ;
n = strlen (x );
m = strlen (y );
f o r ( i n t i = 0 ; i <= n ; i ++) D[ i ] [ 0 ] = 0 ;
f o r ( i n t j = 0 ; j <= m; j ++) D [ 0 ] [ j ] = 0 ;
f o r ( i n t i = 1 ; i <= n ; i ++)
f o r ( i n t j = 1 ; j <= m; j ++)
i f ( x [ i −1] == y [ j −1] )
D[ i ] [ j ] = D[ i − 1 ] [ j −1] + 1 ;
else
D[ i ] [ j ] = max (D[ i − 1 ] [ j ] , D[ i ] [ j − 1 ] ) ;
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 17 / 50
LCS
ε B D C A B C
ε 0 0 0 0 0 0 0
A 0 0 0 0 1 1 1
B 0 1 1 1 1 2 2
C 0 1 1 2 2 2 3
B 0 1 1 2 2 3 3
D 0 1 2 2 2 3 3
A 0 1 2 2 3 3 3
B 0 1 2 2 3 4 4
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 18 / 50
Reduzindo os requisitos de memória
int D[ 2 ] [ 1 0 0 1 ] ;
int ans ;
n = strlen (x );
m = strlen (y );
f o r ( i n t j = 0 ; j <= m; j ++) D [ 0 ] [ j ] = 0 ;
f o r ( i n t i = 1 ; i <= n ; i ++){
i n t i i = i &1;
D[ i i ] [ 0 ] = 0 ;
f o r ( i n t j = 1 ; j <= m; j ++){
i f ( x [ i −1] == y [ j −1] )
D[ i i ] [ j ] = D[1− i i ] [ j −1] + 1 ;
else
D[ i i ] [ j ] = max (D[1− i i ] [ j ] , D[ i i ] [ j − 1 ] ) ;
}
}
a n s = D[ n & 1 ] [m ] ;
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 19 / 50
Variações
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 20 / 50
Subset sum
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 21 / 50
Subset Sum
Defina os subproblemas
(
1, se existe um subconjunto a[1 . . . i] cuja soma é j
I Seja Mij =
0, caso contrário
Encontre a recorrência
I Seja Mij = Mi−1,j || Mi−1,j−ai
Resolva os casos bases:
I Mi0 = 1, 0 ≤ i ≤ n
I M0j = 0, 1 ≤ j ≤ K
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 22 / 50
Implementação
f o r ( i n t i = 1 ; i <= n ; i ++){
f o r ( i n t j = 1 ; j <= K ; j ++){
i f ( j < a [ i −1])
M[ i ] [ j ] = M[ i − 1 ] [ j ] ;
else
M[ i ] [ j ] = M[ i − 1 ] [ j ] | | M[ i − 1 ] [ j −a [ i − 1 ] ] ;
}
}
a n s = M[ n ] [ K ] ;
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 23 / 50
Tabela de subproblemas
0 1 2 3 4 5 6 7 8 9
0 1 0 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0 0
2 1 1 0 1 1 0 0 0 0 0
3 1 1 0 1 1 1 0 1 1 0
4 1 1 0 1 1 1 0 1 1 0
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 24 / 50
Implementação
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 25 / 50
Variações
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 26 / 50
1 Programação Dinâmica
2 Programação Dinâmica 1D
3 Programação Dinâmica 2D
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 27 / 50
Maior substring palindrome
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 28 / 50
Maior substring palindrome
Defina os subproblemas
(
1, se s[i . . . j] é palindrome
I Seja Dij =
0, caso contrário
Recorrência
I Seja Dij = Di−1,j−1 &&s[i] == s[j]
Resolva os casos bases:
I Dii = 1
I Di,i+1 = s[i] == s[i + 1]
A tabela é preenchida diagonalmente.
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 29 / 50
Execução d = 0
a b b a a b
a 1
b 1
b 1
a 1
a 1
b 1
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 30 / 50
Execução d = 1
a b b a a b
a 1 0
b 1 1
b 1 0
a 1 1
a 1 0
b 1
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 31 / 50
Execução d = 2
a b b a a b
a 1 0 0
b 1 1 0
b 1 0 0
a 1 1 0
a 1 0
b 1
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 32 / 50
Execução d = 3
a b b a a b
a 1 0 0 1
b 1 1 0 0
b 1 0 0 1
a 1 1 0
a 1 0
b 1
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 33 / 50
Execução d = 4
a b b a a b
a 1 0 0 1 0
b 1 1 0 0 0
b 1 0 0 1
a 1 1 0
a 1 0
b 1
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 34 / 50
Execução d = 5
a b b a a b
a 1 0 0 1 0 0
b 1 1 0 0 0
b 1 0 0 1
a 1 1 0
a 1 0
b 1
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 35 / 50
Implementação
i n t m a i o r p a l i n d r o m e s u b s t r i n g ( char * s ){
int n = strlen ( s );
v e c t o r <v e c t o r <char> > D ;
D. r e s i z e ( n ) ;
f o r ( i n t i = 0 ; i < n ; i ++) D[ i ] . a s s i g n ( n , 0 ) ;
i n t maxLenght = 1 ;
f o r ( i n t i = 0 ; i < n ; i ++) D[ i ] [ i ] = 1 ;
f o r ( i n t i = 0 ; i < n −1; i ++){
i f ( s [ i ] == s [ i +1] ) {
D[ i ] [ i +1] = 1 ;
maxLenght = 2 ;
}
}
f o r ( i n t d = 3 ; d <= n ; d++){
f o r ( i n t i = 0 ; i < n−d +1; i ++){
i n t j = i + d −1;
i f ( D[ i + 1 ] [ j −1] && s [ i ] == s [ j ] ) {
D[ i ] [ j ] = 1 ;
maxLenght = d > maxLenght ? d : maxLenght ;
}
}
}
r e t u r n maxLenght ;
}
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 36 / 50
Palindrome
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 37 / 50
Multiplicações de cadeia de matrizes
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 38 / 50
Multiplicação de Matrizes
Defina os subproblemas
I Mi,j = número mı́nimo de operações de multiplicações necessárias para
computar Ai Ai+1 . . . Aj sendo que as dimensões da matriz Ai é dado
por pi−1 × pi .
Defina a recorrência
I Mij = min{i≤k≤j−1} Mik + Mk+1,j + pi−1 pk pj
Resolva os casos bases
I Mii = 0
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 39 / 50
Implementação
#i n c l u d e <s t d i o . h>
#i n c l u d e < l i m i t s . h>
i n t MatrixChainOrder ( i n t p [ ] , i n t n ){
i n t m[ n ] [ n ] ;
f o r ( i n t i =1; i <n ; i ++) m[ i ] [ i ] = 0 ;
f o r ( i n t L=2; L<n ; L++){
f o r ( i n t i =1; i <n−L+1; i ++){
i n t j = i+L −1;
m[ i ] [ j ] = INT MAX ;
f o r ( i n t k=i ; k<=j −1; k++){
i n t q = m[ i ] [ k ] + m[ k + 1 ] [ j ] + p [ i −1] * p [ k ] * p [ j ] ;
i f ( q < m[ i ] [ j ] )
m[ i ] [ j ] = q ;
}
}
}
return m[ 1 ] [ n −1];
}
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 40 / 50
Implementação
#i n c l u d e <s t d i o . h>
#i n c l u d e < l i m i t s . h>
i n t NaiveMatrixChainOrder ( i n t p [ ] , i n t i , i n t j ){
i f ( i == j ) r e t u r n 0 ;
i n t min = INT MAX ;
f o r ( i n t k = i ; k < j ; k++){
int q = NaiveMatrixChainOrder (p , i , k ) +
N a i v e M a t r i x C h a i n O r d e r ( p , k +1 , j ) +
p [ i −1] * p [ k ] * p [ j ] ;
i n t main ( ) {
i n t a r r [ ] = {40 , 20 , 30 , 10 , 30};
i n t n = s i z e o f ( a r r )/ s i z e o f ( i n t ) ;
p r i n t f ( ”Minimum number o f m u l t i p l i c a t i o n s i s %d ” ,
NaiveMatrixChainOrder ( arr , 1 , n −1));
return 0;
}
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 41 / 50
Implementação
#i n c l u d e <s t d i o . h>
#i n c l u d e < l i m i t s . h>
#i n c l u d e <v e c t o r >
u s i n g namespace s t d ;
v e c t o r < v e c t o r <i n t > > M;
i n t MemoMatrixChainOrder ( i n t p [ ] , i n t i , i n t j )
{
i f ( i == j ) r e t u r n 0 ;
i f ( M[ i ] [ j ] != −1 ) r e t u r n M[ i ] [ j ] ;
i n t min = INT MAX ;
f o r ( i n t k = i ; k < j ; k++){
i n t q = MemoMatrixChainOrder ( p , i , k ) +
MemoMatrixChainOrder ( p , k +1, j ) +p [ i −1] * p [ k ] * p [ j ] ;
i f ( q < min ) min = q ;
}
r e t u r n M[ i ] [ j ] = min ;
}
i n t main ( ) {
i n t a r r [ ] = {40 , 20 , 30 , 10 , 30};
i n t n = s i z e o f ( a r r ) / s i z e o f ( i n t ) ; M. r e s i z e ( n ) ;
f o r ( i n t i = 0 ; i < n ; i ++) M[ i ] . a s s i g n ( n , −1);
p r i n t f ( ”Minimum number o f m u l t i p l i c a t i o n s i s %d ” ,
MemoMatrixChainOrder ( a r r , 1 , n − 1 ) ) ;
}
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 42 / 50
1 Programação Dinâmica
2 Programação Dinâmica 1D
3 Programação Dinâmica 2D
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 43 / 50
Conjunto Independente Máximo
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 44 / 50
Conjunto Independente Máximo
Recorrência
I Se v é escolhido, então seus filhos não podem ser escolhidos
X
Bv = 1 + Bu (1)
u∈netos(v )
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 45 / 50
1 Programação Dinâmica
2 Programação Dinâmica 1D
3 Programação Dinâmica 2D
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 46 / 50
Problema do caixeiro viajante
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 47 / 50
Problema do caixeiro viajante
Subproblema
I DS,v comprimento do caminho mı́nimo que visita todos os vértices do
conjunto S exatamente uma única vez e termina em v .
I Existem aproximadamente n2n subproblemas
I A resposta é DV −{0},0 onde V é o conjunto de vértices.
Recorrência:
Caso Base:
D∅,v = dist[0][v ] (4)
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 48 / 50
Implementação
#i n c l u d e < s t d i o . h>
#i n c l u d e < l i m i t s . h>
int n = 4;
i n t d i s t [ ] [ 4 ] = { {0 ,12 ,11 ,16} , {15 ,0 ,15 ,10} ,
{8 ,14 ,0 ,18} , {9 ,11 ,17 ,0} };
i n t dp [ 1 < < 4 ] [ 4 ] ;
i n t t s p ( i n t mask , i n t v ) {
i f ( mask == 0 ) r e t u r n d i s t [ 0 ] [ v ] ;
i n t min = INT MAX ;
f o r ( i n t i = 0 ; i < n ; i ++){
i f ( ( mask & (1<< i ) ) != 0 ) {
i n t q = t s p ( mask ˆ (1<< i ) , i ) + d i s t [ i ] [ v ] ;
i f ( q < min ) min = q ;
}
}
r e t u r n min ;
}
i n t main ( ) {
i n t mask = 0 ;
f o r ( i n t i = 0 ; i < n ; i ++) mask |= 1<< i ;
f o r ( i n t i =0; i <(1<<n ) ; i ++)
f o r ( i n t j = 0 ; j < n ; j ++) dp [ i ] [ j ] = −1;
i n t q = t s p ( mask ˆ (1<<0) , 0 ) ;
}
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 49 / 50
Implementação
i n t t s p ( i n t mask , i n t v ) {
i f ( mask == 0 ) r e t u r n d i s t [ 0 ] [ v ] ;
i f ( dp [ mask ] [ v ] != −1) r e t u r n dp [ mask ] [ v ] ;
i n t min = INT MAX ;
f o r ( i n t i = 0 ; i < n ; i ++)
{
i f ( ( mask & (1<< i ) ) != 0 ) {
i n t q = t s p ( mask ˆ (1<< i ) , i ) + d i s t [ i ] [ v ] ;
i f ( q < min ) min = q ;
}
}
dp [ mask ] [ v ] =min ;
r e t u r n dp [ mask ] [ v ] ;
}
i n t main ( ) {
i n t mask = 0 ;
f o r ( i n t i = 0 ; i < n ; i ++) mask |= 1<< i ;
f o r ( i n t i =0; i <(1<<n ) ; i ++)
f o r ( i n t j = 0 ; j < n ; j ++) dp [ i ] [ j ] = −1;
i n t q = t s p ( mask ˆ (1<<0) , 0 ) ;
}
Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 50 / 50