Você está na página 1de 1

Lista 2 – Análise de Algoritmos 2022.

2 – UFABC
Aritanan Gruber
aritanan.gruber@ufabc.edu.br
http://professor.ufabc.edu.br/∼aritanan.gruber

Entrega via Moodle até 29/08/2022 às 23h59


(120/100 pontos)

1. (5+5+10) Seja S[1..n] uma sequência (de inteiros). Uma sequência T [1..m] é subsequência de S se existem índices
i1 , i2 , . . . , im com 1 ≤ i1 < i2 < · · · < im ≤ n tais que T [j] = S[ij ]. Uma subsequência T de S é crescente se
T [1] ≤ T [2] ≤ · · · ≤ T [m]. Uma subsequência crescente T é máxima (= mais longa) se o valor de m é o maior
possível. Denote por (LIS) o problema de determinar uma subsequência crescente máxima para S.

(a) Descreva e prove a subestrutura ótima dos subproblemas de (LIS).


(b) Obtenha uma recorrência para uma solução recursiva simples de (LIS) e analise o tempo requerido por ela.
(c) Forneça um algoritmo baseado em programação dinâmica que resolve (LIS) em tempo O(n2 ).

Dica: defina c[j] como o comprimento de uma sequência mais longa em S com início em S[j].
2. (20) Continuando o exercício anterior, forneça um algoritmo baseado em programação dinâmica que resolve (LIS)
em tempo O(n log n).
Dica: o último elemento de uma subsequência candidata (a máximo) de comprimento i é maior ou igual ao último
elemento de uma subsequência candidata de comprimento i − 1.
3. (10) Seja A um conjunto de aulas a serem escalonadas em uma universidade. Supondo que existam tantas salas
quanto necessário, forneça um algoritmo que determina um escalonamento viável (= aulas com intersecção de horários
não são alocadas em uma mesma sala ao mesmo tempo) para A utilizando o menor número de salas possível.
4. (20) Mostre como resolver o problema da mochila fracionária em tempo O(n), sem supor que os inteiros em v[1..n]
e w[1..n] são limitados (i.é, o uso de RadixSort não é uma solução apropriada).
Dica: Modifique o algoritmo de determinação da mediana em tempo linear.
5. (10+10+10+10) Considere o problema de troca para n centavos de Real usando o menor número de moedas possível.
Suponha que o valor de cada moeda é um inteiro.

(a) Suponha que as moedas disponíveis têm denominações 1, 5, 10, 25. Forneça um algoritmo guloso para este caso
e prove sua correção.
(b) Suponha que as moedas disponíveis têm denominações que são potências de c: c0 , c1 , . . . , ck , para inteiros c > 1
e k ≥ 1. Mostre que o algoritmo guloso sempre encontra uma solução ótima neste caso.
(c) Forneça um conjunto de denominações de moedas para o qual o algoritmo guloso não garante que a solução
devolvida seja ótima. Inclua a moeda de 1 centavo no seu conjunto para que a troca seja possível para qualquer
valor de n.
(d) Forneça um algoritmo com consumo de tempo O(nk) que faça a troca para qualquer conjunto com k denomi-
nações diferentes de moedas, assumindo que uma delas é a de 1 centavo.
6. (10) Prove que se NP 6= co-NP, então P 6= NP.

Você também pode gostar