PUC-Rio Departamento de Informática Profs. Marcus Vinicius S. Poggi de Aragão Período: 2009.1 Horário: 3as-feiras e 5as-feiras de 17-19 horas 28 de junho de 2009
ESTRUTURAS DISCRETAS (INF 1631)
3a Lista de Exercícios
Procure ser conciso e preciso nas suas argumentações.
Um comerciante possui um armazém que utiliza para suprir seus clientes de um único produto. O seu armazém pode guardar até C unidades do produto. Para as próximas T semanas o comerciante TEM que atender às demandas dos seus clientes que somam dt para a semana t, onde t=1,2,...,T. Além disso, ele possui s0(£ C) unidades em estoque antes do início da primeira semana, e já negociou com os fornecedores os preços unitários pt (t=1,2,...,T). Ele deseja planejar o atendimento dos seus clientes de modo a gastar o mínimo possível com a compra do produto.
Ajude ao comerciante a definir a sua estratégia ótima de compra do produto
nas semanas t=1,..., T.
Apresente o algoritmo que obtém a estratégia de compra de menor custo e atende às demandas dos seus clientes.
Explique que reforço da hipótese indutiva deve ser utilizado para se obter um algoritmo eficiente para este cálculo.
Mostre como fica a prova do passo indutivo e sua relação com o algoritmo proposto.
Execute o seu algoritmo sobre a seguinte instância: C=12, T=5,s0 = 3, d1 = 7, d2 = 4, d3 = 15, d4 = 10, d5 = 7 e
p1 = 3, p2 = 4, p3 = 7, p4 = 6, p5 = 8. Informe quanto o comerciante deve comprar em cada semana e o seu custo total.
Seja uma sequência de n inteiros distintos T = { t1, ..., tn }.
Utilize indução matemática (com reforço de hipótese) para propor um algoritmo que obenha a maior subsequência crescente (não necessariamente consecutiva).
Mostre como os algoritmos obtidos acima funcionam na sequência:
Prove por indução e dê o algoritmo recursivo que resulta
da sua prova.
Teorema: Todos os vértices de uma qualquer
árvore podem ser coloridos (sem ter vértices
adjacentes com uma mesma cor) com duas cores. Uma árvore é um
grafo não orientado G=(V,E) sem ciclos, conexo, e onde |E|=|V|-1.
Dicas: use indução simples nos vértices e observe que qualquer
árvore pode ser construída a partir de um vértice sozinho, com
a inserção sucessiva de um vértice conectado a uma aresta.
Você deve escrever o algoritmo para colorir uma árvore qualquer
com duas cores.
Seja G=(V,E) um grafo orientado e acíclico, então
existe uma renumeração dos seus vértices tal que todos os vértices
que podem ser atingidos a partir de um vértice v, v Î V,
estão renumerados com valores superiores a v.
Prove por indução o teorema abaixo e dê o algoritmo recursivo que resulta
da sua prova.
Teorema: Todo grafo conexo e acíclico possui pelo menos
um vértice com grau
de entrada (número de arcos que chegam em um vértice) igual a ZERO.
Dicas: use indução simples nos vértices. Utilize n=2 como caso
base e mostre que o teorema vale para esta caso por exaustão.
Você deve escrever um algoritmo que encontre uma renumeração dos
vértices que
satisfaça a propriedade descrita no início da questão.
A entrada do algoritmo é um grafo, i.e. um conjunto de vértices e
um conjunto de arcos. A saída é a renumeração dos vértices,
i.e. por exemplo: os vértices 1, 2, 3, 4 e 5 devem ser renumerados
como 2, 4, 1, 5, 3.
Seja G=(V,E) um grafo não-orientado.
Deseja-se decidir se G é um grafo bi-partido ou não.
Um grafo é bi-partido se existe uma partição de V, V1 e
V2 (V1 Ç V2 = Ø , V1 È V2 = V) tal que
" (u,v)Î E, tem-se que u Î V1 e v Î V2 ou
vice-versa. Isto é, não existe aresta entre vértices de V1 ou
V2.
Caso G seja bi-partido, deseja-se obter a partição V1 e V2 de
V.
Elabore o caso base e a hipótese indutiva para a prova, por
indução, de que
sabe-se encontrar um tal conjunto. Descreva o algoritmo resultante de
sua prova.
Logo após uma operação de sucesso dois ladrões decidem
se separar. Entretanto, o resultado da operação foi um conjunto de
objetos indivisíveis (de alta liquidez) cujos valores de mercado são bem estabelecidos e
conhecidos pelos ladrões (de alto nível, é claro), o que dificulta
a partilha. O problema dos ladrões é dividir entre eles o conjunto de
objetos roubados de modo que a diferença entre o valor total que cada um vai
ficar seja a menor possível. Sabendo que são n objetos e que seus valores
são v1, v2, ..., vn, responda aos itens abaixo.
Utilizando indução matemática (com reforço de hipótese), mostre
como pode-se construir uma divisão dos objetos que tenha diferença de
valor a menor possível.
Descreva, de forma compacta, o algoritmo resultante.
Mostre como o seu algoritmo funciona caso sejam 5 objetos
com os seguintes valores: v1 = 5, v2 = 4, v3 = 7,
v4 = 3, v5 = 17.
Dica: Reforce a hipótese de modo que as divisões dos objetos sejam
conhecidas para cada valor total atribuído a cada ladrão.
Suponha que antes de chegar ao local da partilha os ladrões tiveram que
carregar os objetos. Assuma que os pesos dos objetos são
p1, p2, ..., pn e que os ladrões possuem juntos
uma mochila que resiste ao peso máximo de P.
Utilize indução matemática (com reforço de hipótese) para
projetar um algoritmo que encontra o maior valor total, em objetos,
que os ladrões podem carregar na mochila (represente por V(k)
este valor para os objetos 1,2,...,k; reforce a hipótese
assumindo que este valor pode ser calculado, dado que o peso total dos
objetos na mochila é exatamente q, para todos os pesos possíveis;
represente por V(k,q) este valor).
Mostre como o seu algoritmo funciona caso sejam 5 objetos
com os valores: v1 = 5, v2 = 4, v3 = 7,
v4 = 3, v5 = 10 e os respectivos pesos p1 = 5, p2 = 3, p3 = 6,
p4 = 4, p5 = 7 onde o peso máximo suportado pela mochila é 9.
Como você resolveria esse problema se os ladrões tivessem duas mochilas ?
Sejam duas sequências de inteiros distintos T = { t1, ..., tn }
e Q = { q1, ..., qm }.
Utilize indução matemática (com reforço de hipótese) para propor um algoritmo que obtenha a maior subsequência (não necessariamente consecutiva) comum às duas sequências (T e Q).
Qual é o reforço de hipótese utilizado ?
Explique a recursão resultante (i.e., o algoritmo):
custo(i,j) = max { custo(i-1,j), custo(i,j-1), custo(i-1, j-1) + d }
onde d vale 1 se ti = qj e 0 caso contrário.
Qual o valor dos custos: custo(0,0), custo(i,0) para i=1,...,n e custo(0,j) para j=1,...,m ?
Considere que para cada par de elementos de T e Q, ti e qj é associado um custo positivo
cij, i=1,...,n, j=1,...,m. Proponha um algoritmo para encontrar a subsequência comum
onde a soma dos custos dos elementos é maximizada.
O que muda na recursão resultante ? Apresente a nova recursão resultante.
Mostre como os algoritmos obtidos acima funcionam nas sequências:
3, 7, 9, 2, 3, 6, 2, 8
e
3, 5, 8, 7, 9, 2, 3, 6, 7
Execute o algoritmo do item (b) com os custos cij=i + j.
Considere o problema de encontrar a sub-árvore de uma árvore enraizada no vértice r cujo peso é máximo. A sub-árvore também deverá ser enraizada em r. O problema é definido da seguinte forma: dada uma árvore (é um grafo não-orientado, é
claro) T=(V,E), um vértice raiz r Î V e pesos wv associados aos vértices de V, determinar uma árvore T*=(V*, E*), contida em T onde r Î V* e a soma åv Î V*wv é máxima.
A árvore vazia vale zero(0) e, naturalmente, os valores dos pesos podem ser positivos ou negativos. Responda:
Use reforço de hipótese para propor um algoritmo que obtenha uma sub-árvore de peso máximo
(nesse caso, o reforço é supor que conhece-se a sub-árvore de peso máximo com raiz em cada um dos vértices filhos, e
indução prova que se é verdade para os filhos então é verdade para os pais).
Represente a árvore determinando para cada vértice o seu vértice pai (p(v) é o pai de v).
Execute o seu algoritmo sobre a seguinte instância: r=1, V={1,..., 12},
E={ (1,2), (1,3), (2,4), (2,5), (2,6), (3,7), (3,8), (5,9), (5,10), (8,11), (8,12)},
w1 = -2, w2 = -1, w3 = -1, w4 = 4, w5 = -6, w6 = -1, w7 = -1, w8 = 1, w9 = 2,
w10 = 3, w11 = -2 e w12 = 3.
Considere o seguinte jogo: Dada um sequência de n (n é par) cartas enfileiradas com valores
positivos e inteiros v1, v2, ..., vn abertos (conhecidos). Dois
jogadores J1 e J2 alternam a vez de jogar. Uma jogada consiste em pegar
uma carta de uma das pontas (a carta 1 ou a n no início, a 2 ou a n se o primeiro
a jogar pegou a carta 1, ou 1 ou a n-1 se ele pegou a carta n). Vence aquele cuja soma dos
valores das cartas que pegou for maior.
Apresente uma sequência de cartas onde o primeiro jogador não pegar o maior valor possível
se ele escolhe a carta de maior valor na primeira jogada. (Ou seja, mostre que a estratégia gulosa
não funciona para este problema.)
Proponha um algoritmo que calcule a estratégia ótima para o primeiro jogador. Uma estratégia ótima é a informação necessária para que o jogador 1 determine
cada uma das suas jogadas de modo a obter, no final, o maior valor possível.