Trabalho com programação dinâmica há algum tempo. A maneira canônica de avaliar uma recursão de programação dinâmica é criando uma tabela de todos os valores necessários e preenchendo-a linha por linha. Veja, por exemplo , Cormen, Leiserson et al: "Introdução aos algoritmos" para uma introdução.
Focalizo o esquema de computação baseado em tabela em duas dimensões (preenchimento linha a linha) e investigo a estrutura das dependências de células, ou seja, quais células precisam ser executadas antes que outras possam ser computadas. Nós denotar com o conjunto de índices de células a célula depende. Observe que precisa estar livre de ciclos.
Eu abstraio da função real que é calculada e concentro-me em sua estrutura recursiva. Formalmente, eu considero um recurrrence ser programação dinâmica se ele tem a forma
com , e alguma função (calculável) que não faz use diferente de via .
Ao restringir a granularidade de a áreas ásperas (à esquerda, superior esquerda, superior, superior direita, ... da célula atual), observa-se que existem essencialmente três casos (até simetrias e rotação) válidos recursões de programação dinâmica que informam como a tabela pode ser preenchida:
As áreas vermelhas denotam (aproximações demais de) . Os casos um e dois admitem subconjuntos, o caso três é o pior caso (até a transformação do índice). Observe que não é estritamente necessário que todas as áreas vermelhas sejam cobertas por Γ ; algumas células em cada parte vermelha da tabela são suficientes para pintar de vermelho. É explicitamente necessário que as áreas brancas não contenham nenhuma célula necessária.
Exemplos para o caso um são a distância de edição e a subsequência comum mais longa , o caso dois se aplica a Bellman & Ford e CYK . Exemplos menos óbvios incluem aqueles que trabalham nas diagonais, em vez de linhas (ou colunas), pois podem ser rotacionados para se ajustarem aos casos propostos; veja a resposta de Joe para um exemplo.
Não tenho exemplo (natural) para o caso três! Então, minha pergunta é: Quais são os exemplos para o caso de três recursões / problemas de programação dinâmica?