Sie sind auf Seite 1von 50

Desafios de Programação

Programação Dinâmica

1
Wladimir Araújo Tavares

1 Universidade Federal do Ceará - Campus de Quixadá

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

4 Programação Dinâmica em Intervalos

5 Programação Dinâmica em árvores

6 Programação Dinâmica em subconjuntos

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?

Wikipédia: Método para resolver problemas complexos dividindo-os


em subproblemas mais simples.

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

4 Programação Dinâmica em Intervalos

5 Programação Dinâmica em árvores

6 Programação Dinâmica em subconjuntos

Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 5 / 50
Coin Change

Problema: Dado n, encontre o número de diferentes maneiras de


escrever n como soma de 1, 3 e 4
Exemplo: para n=5, a resposta é 6
5 = 1 + 1 + 1+1+1
= 1 + 1 + 3
= 1 + 3 + 1
= 3 + 1 + 1
= 1 + 4
= 4 + 1

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

4 Programação Dinâmica em Intervalos

5 Programação Dinâmica em árvores

6 Programação Dinâmica em subconjuntos

Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 14 / 50
LCS

Problema: Dado duas strings x e y , encontre o tamanho da maior


subsequência comum (LCS)
Exemplo:
I x: ABCBDAB
I y: BDCABC
I BCAB é a maior subsequência encontrada e o seu tamanho é 4

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

1 Resolva o problema LIS usando LCS.


2 Dado duas strings x e y encontre o comprimento da menor string z tal
que x e y são subsequência de z.
3 Dado duas strings s1 e s2 e as operações INSERÇÃO, REMOÇÃO e
SUBSTITUIÇÃO pode ser executada na string s1. Encontre o número
mı́nimo de operações necessárias para converter s1 em s2.

Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 20 / 50
Subset sum

Problema: Dado um conjunto de n números ai cuja a soma é L e


K ≤ L. Existe um subconjunto de números ai cuja soma é K ?
Exemplo: a[] = {1,3,4,7}
K RESPOSTA PROVA
8 SIM {1,7}
9 NÃO
10 SIM {7,3}

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 =0; i <= n ; i ++) M[ i ] [ 0 ] = 1 ;


f o r ( i n t j =1; j <= K ; j ++) M[ 0 ] [ j ] = 0 ;

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

f o r ( i n t i =0; i <= K ; i ++) m[ i ] = 0 ;


m[ 0 ] = 1 ;
f o r ( i n t i = 0 ; i < n ; i ++){
f o r ( i n t j = K ; j >= a [ i ] ; j −−){
m[ j ] = m[ j ] | m[ j −a [ i ] ] ;
}
}
a n s = m[ K ] ;

Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 25 / 50
Variações

1 Suponha que ai represente o número de doces de caixa. Você quer


dividir o mais justo possı́vel entre duas crianças.
2 Cada ai pode ser usado mais de uma vez para alcançar um valor K.
3 Suponha que ai represente moedas, você quer minimizar o número de
moedas para dar o troco de valor K.
4 Você quer dividir os doces de maneira mais justa possı́vel entre três
crianças. [Dica: Resolva o seguinte subproblema m[b][c] indica se
podemos dividir os doces tal que a primeira criança recebe b e a
segunda recebe c].
5 Problema da mochila com repetição de objetos.

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

4 Programação Dinâmica em Intervalos

5 Programação Dinâmica em árvores

6 Programação Dinâmica em subconjuntos

Wladimir Araújo Tavares (UFC) Desafios de Programação Programação Dinâmica 30 de março de 2017 27 / 50
Maior substring palindrome

Problema: Dado uma string, encontre o tamanho da maior substring


que é palindrome.
Por exemplo, se a string é ”desproggorpdes”, a maior string
palindrome é ”proggorp”.

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

Problema: Dado uma string x, encontre o número mı́nimo de


caracteres que precisa ser inserido para que x torne-se palindrome.
Exemplo:
I x = ”Ab3bd”
I Inserindo dois caracteres podemos obter ”dAb3bAd”ou ”Adb3bdA”

1 Resolva usando programação dinâmica em intervalos.


2 Resolva usando LCS.

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

Problema: Dado uma sequência de matrizes, encontre uma maneira


eficiente de multiplicar essas matrizes. O problema não é executar os
multiplicações, mas apenas decidir a ordem em que as multiplicações
serão executadas.
Exemplo: ABCD
1 (A(BC))D
2 ((AB)C)D
3 (AB)(CD)
4 (A(BC)D)
5 A(B(CD))

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 f ( q < min ) min = q ;


}
r e t u r n 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 ) ;
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

4 Programação Dinâmica em Intervalos

5 Programação Dinâmica em árvores

6 Programação Dinâmica em subconjuntos

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

Problema: dado uma árvore, encontre o maior conjunto independente


nela.
Subproblemas
I Decida arbitrariamente a raiz da árvore.
I Bv : solução ótima para a subárvore tendo v como raiz e incluindo v no
conjunto independente.
I Wv : solução ótima para a subárvore tendo v como raiz e não incluindo
v no conjunto independente.
I Resposta é max{Br , Wr }

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 )

I Se v não é escolhido, então seus filhos podem ou não serem escolhidos.


X
Bv = 1 + max{Bu , Wu } (2)
u∈filhos(v )

Casos Bases: Folhas.

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

4 Programação Dinâmica em Intervalos

5 Programação Dinâmica em árvores

6 Programação Dinâmica em subconjuntos

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

Problema: Dado um grafo ponderado com n vértices, encontre o


menor caminho que visita todos os nós exatamente uma vez
começando e terminando no vértice 0.
Esse problema não é NP-difı́cil?
I Sim, mas pode ser resolvido em O(n2n )
I O algoritmo de força bruta roda em O(n!)

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:

DS,v = minu∈S (DS−{u},u + dist[u][v ]) (3)

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

Das könnte Ihnen auch gefallen