O objetivo deste artigo é listar e passar por vários problemas não clássicos de programação dinâmica, de forma a treinar um pouco diferentes padrões de aplicação deste método. Adicionalmente, introduziremos tipos de aplicações de programação dinâmica.

Exemplos iniciais

Começamos por ver alguns artigos que abordam alguns problemas em concreto e que explicam uma solução possível:

Artigo: Capítulo 3.4.1 do livro Competitive Programming I

Ler das páginas 49 a 55 do livro.

Nota: Para quem não tem o livro

É normal que muitos não tenham uma cópia do livro. Felizmente a primeira edição do livro está disponível de graça neste link, a página 49 à 55 (ou da 61 à 67 do PDF).

DAG

Uma estrutura menos regular onde é possível aplicar programação dinâmica é um DAG (Directed Acyclic Graph). Parece um caso muito particular, mas na verdade há muitos tipos de problemas que podem ser vistos como um DAG, por exemplo, problemas em grelhas ou outras estruturas em que os movimentos sejam unidirecionais (não se pode voltar atrás). Vejamos um artigo sobre o assunto:

Artigo: Programação dinâmica em DAGs

Um artigo do P3G sobre programação dinâmica que inclui uma discussão sobre DAGs e problemas de contagem.

Se tiverem dúvidas ou quiserem algo mais específico sobre a formulação base do método podem ver este artigo mais particular:

Artigo: Artigo sobre caminhos mais longos em DAGs

Um artigo sobre caminhos mais longos em DAG com uma explicação mais detalhada de programação dinâmica nestas estruturas.

Bitmask

Outro tipo de programação dinâmica menos óbvia é usar como objetos que definem um subproblema um conjunto em vez de um inteiro. Para este tipo de coisa usa-se uma técnica chamada bitmasking que consiste em codificar conjuntos com inteiros tendo certos bits a 1 e a 0 para representar os elementos que estão incluídos ou não no conjunto.

Artigo: Bitmasking

Um artigo que contém uma breve explicação do método assim como um exemplo clássico.

* Extra

Para não ficarem com falta de tipos de programação dinâmica, aqui têm mais um conjunto de vários artigos interessantes:

*Artigo: Técnicas de programação dinâmica

Um artigo que contém outras técnicas que não discutimos até agora.

Outra técnica engraçada relacionada é conhecida como delta encoding. O objetivo é calcular eficientemente um conjunto de atualizações de intervalos de valores ao deixar o trabalho necessário para o fim. Para verem melhor este método vejam um problema e a sua solução:

*Artigo: Problema e solução de delta encoding

Um problema e correspondente solução sobre o tema.

Aplicação

Finalmente, como não podia faltar, ficam algumas sugestões de problemas a fazer.

Problema 1: George and Job

Problema C da ronda 267 (Div. 2) do CodeForces - George and Job

Problema 2: Kefa and Dishes

Problema D da ronda 321 (Div. 2) do CodeForces - Kefa and Dishes

Problema 3: Journey

Problema C da ronda 374 (Div. 2) do CodeForces - Journey