Publicidade



Programação Dinâmica

Uma das estratégias de resolução algoritmica de problemas mais difíceis de ser aplicada, na minha opinião, é a programação dinâmica. Mas existem alguns truques que facilitam o desenvolvimento de algoritmos baseados nessa idéia.

A maior dificuldade de se usar este método é encontrar a poderosíssima fórmula de recorrência. Uma vez encontrada, o algoritmo está quase pronto. O problema é que, para encontrar a fórmula de recorrência, é preciso pensar recursivamente, afinal programação dinâmica é praticamente uma recursão memorizada.

Vejamos um exemplo: o jogo da velha (inspirado pelo Rafael Izbicki, que me enviou um jogo da velha). Como fazer a melhor jogada em um determinado momento? Uma solução possível é tentar todas as jogadas possíveis até o fim, usando recursão (a melhor jogada para agora é a que ganha supondo que meu adversário vai fazer a melhor depois da minha, e assim por diante), e então escolher uma que dê um bom resultado. Mas, sem guardar as contas, testaríamos muitas vezes as mesmas jogadas. Então por que não guardar todas as seqüências de jogadas possíveis? Se fizermos isso, podemos até manter uma base de dados com todas as melhores jogadas para cada situação.

Note que, podendo memorizar todos os resultados, basta executar o algoritmo apenas uma vez e já teremos todos os resultados. Sem memorização, além de calcular várias vezes as mesmas jogadas, teríamos que executar o algoritmo a cada jogada.

Lógico que nem todo caso é fácil de resolver que nem o exemplo acima. Mas a idéia fundamental por trás da programação dinâmica é a recursão. Então, quando surgir um problema para o qual você tem uma solução recursiva, veja se não é possível memorizar a recursão.

Veja mais exemplos aqui. Note que, em todos, a idéia é tentar dar um passo, ver o que acontece até o fim e aprender com o resultado.

Posts Relacionados:

  • CodeIDE
  • Simpósio Brasileiro de Computação Musical
  • Programação para crianças
  • ACM ICPC - Brasil na maratona de programação 2008
  • Séries
  • Guia Linux - Parte III: Programação
  • Assine nosso RSS feed!

    Tags: , ,

    4 Responses to “Programação Dinâmica”

    1. 1 Rodrigo Menezes

      Muito interessante o tema, fiz um teste em java e coloquei no meu blog

      []’s

    2. 2 Luiz

      Muito legal sua colaboração! Fatorial é um exemplo clássico de programação dinâmica, assim como a seqüência de Fibonacci.

      Obrigado pela visita!

    3. 3 Felipe Ribeiro

      Quando se fala de PD não pode deixar de falar também do conceito de subestrutura ótima, que garante que chegado num ponto X da sua execução você garante que tem em mãos a melhor solução possível do subproblema que envolve todos os casos antes desse caso X. (Não sei se fui claro :P)

      Outros exemplos bons são os que estão no livro do Cormen, como o menor caminho de edição de uma string para se transformar em outra, ou a multiplicação de matrizes, além do problema da mochila binária que pode determinar solução para problemas como: Dado um valor X a ser pago, qual a combinação de cédulas/moedas que eu devo adotar para usar o menor número de cedulas/moedas possiveis. (Mas no modelo que se adota na produção de moedas, tudo é feito para que isso também se resolva com uma estratégia gulosa de sempre pegar a maior moeda que é menor ou igual ao valor total)

    4. 4 Luiz

      Tem razão! Deveria ter falado da subestrutura ótima. Afinal, apenas os problemas recursivos com a subestrutura ótima podem ser transformados em programação dinâmica (me corrijam se eu estiver errado!).

      Obrigado pela visita e pelo ótimo comentário!

    Leave a Reply