Decisão sobre subproblemas para programação dinâmica

39

Eu usei a técnica de programação dinâmica várias vezes, mas hoje um amigo me perguntou como eu definia meus subproblemas, e percebi que não tinha como fornecer uma resposta formal objetiva. Como você define formalmente um subproblema para um problema que você resolveria usando a programação dinâmica?

Daniel Gratzer
fonte
Parece que nenhuma das respostas existentes (a partir de abril de 2019) é boa o suficiente, especialmente para iniciantes. Eu recomendaria tutoriais em outros sites.
Apass.Jack 10/04

Respostas:

35

O princípio da programação dinâmica é pensar de cima para baixo (isto é, recursivamente), mas resolver de baixo para cima. Portanto, uma boa estratégia para projetar um PD é formular o problema recursivamente e gerar subproblemas dessa maneira.

Suresh
fonte
14
Eu afirmo que é a única estratégia.
21412 JeffE
2
@ Jeff Sim, eu li e usei suas anotações ao ensinar minhas aulas de algoritmo e foi eficaz. Citação: "Dinâmico não se trata de preencher tabelas. É uma recursão inteligente!"
Dai
2
O meu entendimento de como ensinar as PD é fortemente influenciada pela @ notas de Jeffe :)
Suresh
3
Também é possível transformar automaticamente um procedimento recursivo de cima para baixo em um algoritmo de programação dinâmica. Quando você estiver prestes a retornar, armazene a resposta em uma tabela de hash. No início de cada chamada, verifique se a resposta já está na tabela de hash e, se estiver, retorne-a imediatamente. Muitos algoritmos se tornam fáceis com essa ideia. Por exemplo, com essa tabela, algoritmos recursivos nas tentativas funcionam automaticamente em DAWGs. Armazenando um valor de sentinela na tabela no início de uma chamada, os mesmos algoritmos podem funcionar mesmo em DFAs. Os algoritmos nos BDDs tornam-se muito fáceis de especificar recursivamente.
Jules
11
Por último, mas não menos importante, isso pode ter enormes vantagens de desempenho. Por exemplo, o algoritmo tradicional de soma de subconjuntos de baixo para cima pode calcular toneladas de entradas de tabela desnecessárias. Com esse método, apenas as entradas necessárias da tabela serão computadas.
Jules
4

Como o @Suresh apontou, depois que você souber que o seu problema pode ser resolvido pelo DP (ou seja, ele exibe uma subestrutura ideal e subproblemas sobrepostos), você pode pensar em uma solução dividida e conquistadora.

O(1)

Portanto, pensar em uma solução de divisão e conquista fornecerá uma visão sobre o que um subproblema pode ser para o seu problema específico.

Massimo Cafaro
fonte
11
"subestrutura ideal" (o que isso significa) provavelmente não é uma condição suficiente para a solvabilidade da DP. "Subproblemas sobrepostos" certamente não é necessário.
Raphael
11
A estrutura ideal e os superproblemas sobrepostos são exibidos por problemas que podem ser resolvidos com eficiência pelo DP. É claro que a subestrutura ideal por si só não é suficiente para a solvabilidade do DP. No entanto, se você não tiver subproblemas sobrepostos, poderá resolver o problema dividindo e conquistando ordinariamente com o mesmo custo: de fato, a vantagem do DP sobre dividir uma conquista é que cada subproblema é resolvido exatamente uma vez quando encontrado na árvore de recursão .
Massimo Cafaro 22/03/12
11
Não é minha formulação: você a encontrará em "Introdução aos algoritmos", de Cormen, Leiserson, Rivest e Stein e em muitos outros livros sobre algoritmos.
Massimo Cafaro
11
Jup, e a maioria está pelo menos parcialmente errada. Fico feliz em elaborar se você postar uma pergunta adequada.
Raphael
11
Não sei se entendi corretamente seu último comentário. Para mostrar que esse tipo de caracterização está incorreto (não pode estar parcialmente errado: está correto ou está errado), você pode simplesmente mostrar como um contra-exemplo, um problema que não exibe a subestrutura ideal e os subproblemas sobrepostos; acessível a uma solução polinomial de DP. Mas observe que, nesse contexto, isso significa uma solução que é comprovadamente melhor do que a divisão e conquista comuns.
Massimo Cafaro 22/03/12
2

Minha experiência é descobrir uma maneira de "reduzir a enumeração redundante com a ajuda do armazenamento de valor útil já enumerado". A propósito, a Programação Dinâmica é realmente popular no ICPC (International Collegiate Programming Contest. Qualquer um pode ter seu próprio sentimento sobre o PD depois de praticar vários problemas do ICPC.

Peng Zhang
fonte