O documento apresenta o problema da maior subsequência palíndroma (LPS) e uma solução eficiente usando programação dinâmica. Em três frases: (1) LPS é encontrar a maior subsequência que é um palíndroma em uma string dada; (2) Uma abordagem exponencial resolve subproblemas repetidamente, enquanto a programação dinâmica evita isso; (3) O algoritmo constroi uma matriz e preenche células de baixo para cima representando strings de tamanhos crescentes para encontrar a LPS em tempo quadrático.
2. Palíndromo
• Palíndromo é uma palavra que é lida da mesma forma da esquerda
para a direita e vice-versa.
• Exemplos de palíndromos: ANA, ATTA
2
3. Longest palindromic subsequence
• Longest palindromic subsequence = LPS
• Mais longa subsequência que é um palíndromo.
• Subsequência: não necessariamente contígua.
• Exemplo de sequência: ATCATA
• LPS: ATCTA, ATATA
• Tamanho do LPS: 5
3
4. Longest palindromic subsequence
• Abordagem custosa:
• Sobreposição de subproblemas.
• Faz o recálculo de subproblemas.
• É lento (complexidade exponencial).
• Vídeo-aula explicando essa abordagem: https://goo.gl/pNZ5bt
• Nesses slides abordaremos esse problema de forma mais eficiente, utilizando
programação dinâmica.
• Com programação dinâmica, conseguiremos sair de uma complexidade
exponencial para quadrática.
4
5. Longest palindromic subsequence
• Você já ouviu falar da LCS?
• LCS = longest common subsequence
• LPS é uma derivação do LCS.
• LCS é encontrar a subsequência que seja comum em ambas as strings
(não necessariamente contíguo).
• Pode-se encontrar o tamanho do LPS utilizando LCS, basta inverter a
string e fazer o LCS da string original com o da string invertida. Essa
solução também é quadrática: O(n^2).
• Vídeo aula sobre LCS: https://goo.gl/INau0Y
5
6. Longest palindromic subsequence
• Nessa apresentação será explicado um algoritmo baseado em
programação dinâmica para resolver o problema do LPS.
• Não iremos utilizar a abordagem para resolver o LCS.
• Nesse problema temos sobreposição de subproblemas.
• A programação dinâmica vai evitar o recálculo desses subproblemas.
• Iremos utilizar a abordagem bottom-up.
6
7. Longest palindromic subsequence
• String: ATCATA
• Resposta: 5 (tamanho do LPS).
• Seja N o tamanho da string, vamos construir uma matriz N x N.
7
9. Longest palindromic subsequence
9
A T C A T A
A
T
C
A
T
A
Inicialmente consideramos strings de tamanho 1 (tam = 1)
Strings de tamanho 1 são palíndromos de tamanho 1
Basta fazer mat[i][i] = 1
12. Longest palindromic subsequence
12
A T C A T A
A 1
T 1
C 1
A 1
T 1
A 1
Considerando strings de tamanho 2 (tam = 2)
String original: ATCATA
Strings de tamanho 2: AT, TC, CA, AT, TA
13. Longest palindromic subsequence
13
A T C A T A
A 1 ?
T 1
C 1
A 1
T 1
A 1
Considerando strings de tamanho 2 (tam = 2)
Vamos preencher mat[0][1] representada pelo “?”
mat[0][1] representa a string AT
14. Longest palindromic subsequence
14
A T C A T A
A 1 ?
T 1
C 1
A 1
T 1
A 1
Considerando strings de tamanho 2 (tam = 2)
mat[0][1] = AT, i = 0, j = 1
“A” é diferente de “T” (extremos), fazemos o max(mat[i][j-1], mat[i+1][j])
15. Longest palindromic subsequence
15
A T C A T A
A 1 ?
T 1
C 1
A 1
T 1
A 1
Considerando strings de tamanho 2 (tam = 2)
mat[0][1] = AT
max(mat[0][0], mat[1][1]) = max(1, 1) = 1
16. Longest palindromic subsequence
16
A T C A T A
A 1 1
T 1 ?
C 1
A 1
T 1
A 1
Considerando strings de tamanho 2 (tam = 2)
mat[1][2] = TC = ?
mat[1][2] = max(mat[1][1], mat[2][2]) = max(1, 1) = 1
17. Longest palindromic subsequence
17
A T C A T A
A 1 1
T 1 1
C 1 ?
A 1
T 1
A 1
Considerando strings de tamanho 2 (tam = 2)
mat[2][3] = CA = ?
mat[2][3] = max(mat[2][2], mat[3][3]) = max(1, 1) = 1
18. Longest palindromic subsequence
18
A T C A T A
A 1 1
T 1 1
C 1 1
A 1 ?
T 1
A 1
Considerando strings de tamanho 2 (tam = 2)
mat[3][4] = AT = ?
mat[3][4] = max(mat[3][3], mat[4][4]) = max(1, 1) = 1
19. Longest palindromic subsequence
19
A T C A T A
A 1 1
T 1 1
C 1 1
A 1 1
T 1 ?
A 1
Considerando strings de tamanho 2 (tam = 2)
mat[4][5] = TA = ?
mat[4][5] = max(mat[4][4], mat[5][5]) = max(1, 1) = 1
20. Longest palindromic subsequence
20
A T C A T A
A 1 1
T 1 1
C 1 1
A 1 1
T 1 1
A 1
Considerando strings de tamanho 3 (tam = 3)
String original: ATCATA
Strings de tamanho 3: ATC, TCA, CAT, ATA
21. Longest palindromic subsequence
21
A T C A T A
A 1 1 ?
T 1 1
C 1 1
A 1 1
T 1 1
A 1
Considerando strings de tamanho 3 (tam = 3)
mat[0][2] = ATC = ?
“A” diferente de “C” (extremos)
Então faz max(mat[i][j-1],mat[i+1][j])
22. Longest palindromic subsequence
22
A T C A T A
A 1 1 ?
T 1 1
C 1 1
A 1 1
T 1 1
A 1
Considerando strings de tamanho 3 (tam = 3)
mat[0][2] = ATC = ?
max(mat[0][1], mat[1][2]) = max(1, 1) = 1
23. Longest palindromic subsequence
23
A T C A T A
A 1 1 1
T 1 1 ?
C 1 1
A 1 1
T 1 1
A 1
Considerando strings de tamanho 3 (tam = 3)
mat[1][3] = TCA= ?
mat[1][3] = max(mat[1][2], mat[2][3]) = max(1, 1) = 1
24. Longest palindromic subsequence
24
A T C A T A
A 1 1 1
T 1 1 1
C 1 1 ?
A 1 1
T 1 1
A 1
Considerando strings de tamanho 3 (tam = 3)
mat[2][4] = CAT = ?
mat[2][4] = max(mat[2][3], mat[1][4]) = max(1, 1) = 1
25. Longest palindromic subsequence
25
A T C A T A
A 1 1 1
T 1 1 1
C 1 1 1
A 1 1 ?
T 1 1
A 1
Considerando strings de tamanho 3 (tam = 3)
mat[3][5] = ATA= ?
Opa, agora “A” == “A” (extremos)
mat[i][j] = mat[i+1][j-1] + 2
26. Longest palindromic subsequence
26
A T C A T A
A 1 1 1
T 1 1 1
C 1 1 1
A 1 1 ?
T 1 1
A 1
Considerando strings de tamanho 3 (tam = 3)
mat[3][5] = ATA= ?
mat[i][j] = mat[i+1][j-1] + 2
mat[3][5] = mat[4][4] + 2 = 1 + 2 = 3
27. Longest palindromic subsequence
27
A T C A T A
A 1 1 1
T 1 1 1
C 1 1 1
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 4 (tam = 4)
String original: ATCATA
Strings de tamanho 4: ATCA, TCAT, CATA
28. Longest palindromic subsequence
28
A T C A T A
A 1 1 1 ?
T 1 1 1
C 1 1 1
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 4 (tam = 4)
mat[0][3] = ATCA
“A” é igual a “A” (extremos)
mat[0][3] = mat[1][2] + 2 = 1 + 2 = 3
29. Longest palindromic subsequence
29
A T C A T A
A 1 1 1 3
T 1 1 1 ?
C 1 1 1
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 4 (tam = 4)
mat[1][4] = TCAT
“T” é igual a “T” (extremos)
mat[1][4] = mat[2][3] + 2 = 1 + 2 = 3
30. Longest palindromic subsequence
30
A T C A T A
A 1 1 1 3
T 1 1 1 3
C 1 1 1 ?
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 4 (tam = 4)
mat[2][5] = CATA
“C” é diferente de “A” (extremos)
mat[2][5] = max(mat[2][4], mat[3][5]) = max(1, 3) = 3
31. Longest palindromic subsequence
31
A T C A T A
A 1 1 1 3
T 1 1 1 3
C 1 1 1 3
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 5 (tam = 5)
String original: ATCATA
Strings de tamanho 5: ATCAT, TCATA
32. Longest palindromic subsequence
32
A T C A T A
A 1 1 1 3 ?
T 1 1 1 3
C 1 1 1 3
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 5 (tam = 5)
mat[0][4] = ATCAT = ?
“A” é diferente de “T”
mat[0][4] = max(mat[0][3], mat[1][4]) = max(3, 3) = 3
33. Longest palindromic subsequence
33
A T C A T A
A 1 1 1 3 3
T 1 1 1 3 ?
C 1 1 1 3
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 5 (tam = 5)
mat[1][5] = TCATA = ?
“T” é diferente de “A”
mat[1][5] = max(mat[1][4], mat[2][5]) = max(3, 3) = 3
34. Longest palindromic subsequence
34
A T C A T A
A 1 1 1 3 3
T 1 1 1 3 3
C 1 1 1 3
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 6 (tam = 6)
Só temos uma string de tamanho 6: ATCATA
35. Longest palindromic subsequence
35
A T C A T A
A 1 1 1 3 3 ?
T 1 1 1 3 3
C 1 1 1 3
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 6 (tam = 6)
mat[0][5] = ?
Veja só, mat[0][5] é mat[0][N-1] onde “N” é o tamanho da string original
A nossa resposta está em mat[0][N-1]
36. Longest palindromic subsequence
36
A T C A T A
A 1 1 1 3 3 ?
T 1 1 1 3 3
C 1 1 1 3
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 6 (tam = 6)
mat[0][5] = ATCATA = ?
“A” é igual a “A”
mat[0][5] = mat[1][4] + 2 = 3 + 2 = 5
37. Longest palindromic subsequence
37
A T C A T A
A 1 1 1 3 3 5
T 1 1 1 3 3
C 1 1 1 3
A 1 1 3
T 1 1
A 1
mat[0][5] = mat[0][N-1] = 5
Tamanho do LPS: 5
38. Longest palindromic subsequence
• Implementação em C++:
• https://goo.gl/bQZuXO
• Vídeo-aula explicando essa apresentação:
• https://youtu.be/fMwNCE1HhJE
• Curso de C++ (mais de 100 vídeo-aulas):
• https://goo.gl/NjdLGH
• Problema de maratona de programação:
• https://www.urionlinejudge.com.br/judge/pt/problems/view/1941
38