
Universidade Federal do Cear´a
Centro de Ciˆencias
Departamento de Computa¸c˜ao
Mestrado e Doutorado em Ciˆencia da Computa¸c˜ao
Constru¸c˜ao e An´alise de Algoritmos
Lista de exerc´ıcios 2
Programa¸c˜ao Dinˆamica
1. Seja P:N→Numa fun¸c˜ao definida da seguinte forma: P(0) = 0 e, para n≥1,
P(n) = Pn
2−1+Pn
2+Pn
2+ 1+n.
Escreva um algoritmo recursivo puro que recebe um n´umero ncomo entrada e retorna o valor exato de
P(n). Calcule a complexidade do seu algoritmo. Escreva agora um algoritmo de programa¸c˜ao dinˆamica para
o mesmo problema e calcule a complexidade. Escreva tamb´em um algoritmo de memoiza¸c˜ao.
2. Uma subsequˆencia cont´ıgua de uma sequˆencia S´e uma subsequˆencia de elementos consecutivos de S.
Por exemplo, se S= (5 15 −30 10 −5 40 10), ent˜ao (15 −30 10) ´e uma subsequˆencia cont´ıgua de S, mas
(5 15 40) n˜ao ´e. Escreva um algoritmo linear para a seguinte tarefa: receba como entrada uma sequˆencia
de n´umeros (a1, a2, . . . , an) e devolva a subsequˆencia cont´ıgua cuja soma ´e m´axima (uma subsequˆencia de
tamanho zero tem soma zero). No exemplo anterior, a resposta seria a subsequˆencia (10 −5 40 10) cuja
soma ´e 55. (Dica: Para cada j∈ {1,2, . . . , n}, considere subsequˆencias cont´ıguas terminando exatamente na
posi¸c˜ao j).
3. Vocˆe vai iniciar uma viagem bastante longa. Vocˆe inicia a viagem no Km 0 (zero). No seu percurso,
existem nhot´eis com quilometragens iguais a a1< a2< . . . < an, onde cada ai´e medido a partir do ponto
de Km 0. Os ´unicos lugares que vocˆe pode parar s˜ao esses hot´eis, mas vocˆe n˜ao precisa parar em todos.
Sua viagem termina no hot´el do Km anque ´e o seu destino. Vocˆe idealmente gostaria de viajar 200 Km por
dia, mas nem sempre isso ´e poss´ıvel (depende do espa¸co entre os hot´eis). Se vocˆe via ja XKm em um dia,
sua esposa o penaliza com (200 −X)2pontos. Vocˆe deseja planejar sua viagem de forma a minimizar seus
pontos penalizados e salvar seu casamento. Ou seja, minimizar a soma das penalidades di´arias de todos os
dias viajados. Escreva um algoritmo que determina a sequˆencia ´otima de hot´eis em que vocˆe deve parar.
4. Vocˆe recebe uma palavra com ncaracteres S[1 . . . n], que vocˆe pensa ser um texto corrompido no qual n˜ao
h´a pontua¸c˜ao (por exemplo, ”euadoroprograma¸c˜aodinˆamica”). Vocˆe deseja reconstruir o seu texto usando
um dicion´ario que disponibiliza uma fun¸c˜ao booleana dict(w) que retorna verdadeiro, se w´e uma palavra do
dicion´ario, e falso, caso contr´ario. Escreva uma algoritmo de programa¸c˜ao dinˆamica que determina se seu
texto pode ser reconstru´ıdo como uma sequˆencia de palavras v´alidas. A complexidade deve ser no m´aximo
O(n2), assumindo que a fun¸c˜ao dict leva tempo constante. Caso seu texto seja v´alido, fa¸ca seu algoritmo
escrever a sequˆencia correta de palavras.
5. Uma subsequˆencia ´e pal´ındroma se ela ´e igual lendo da direita para esquerda ou lendo da esquerda
para direita. Por exemplo, a sequˆencia (AC GT GT C AAAAT CG) possui muitas subsequˆencias pal´ındromas,
como (ACGC A) e (AGT GA). Mas a subsequˆencia (AC T ) n˜ao ´e pal´ındroma. Escreva um algoritmo O(n2)
que recebe uma sequˆencia S[1 . . . n] e retorna a subsequˆencia pal´ındroma de tamanho m´aximo.
6. Escreva um algoritmo O(nT) que recebe um inteiro positivo Te uma lista com ninteiros positivos
(a1, a2, . . . , an) e decide se existe algum subconjunto cuja soma ´e igual a T. (Dica: Observe subconjuntos
(a1, a2, . . . , ak) e verifique se a soma ´e sonde 1 ≤k≤ne 1 ≤s≤T).