Eu venho de uma formação em física e, portanto, muita matemática. Acho fácil identificar problemas bem adequados para soluções de programação dinâmica / recursiva, encontrando semelhanças com provas por indução .
Na prova por indução, você tem duas partes:
- você prova que, se algo é verdadeiro para a iteração N, também é verdade para a iteração N + 1
- você prova que é verdade para a iteração 1
Na programação recursiva / programação dinâmica:
- você identifica uma condição de saída (por exemplo, conecta a solução para a iteração 1)
- você calcula a solução para a iteração N, dada a solução para a iteração N-1
Portanto, como outros responderam, é uma questão de experiência e escolha das dicas, mas você pode reutilizar outras habilidades para guiá-lo. Depois disso, você precisa sempre ter as duas partes que mencionei: se não o fizer, não funcionará.
Por exemplo, para gerar todas as permutações de um conjunto:
- condição de saída: se você tiver apenas um elemento, retorne-o
- recursão: as permutações de um conjunto de N itens são os N conjuntos de permutações que você obtém escolhendo cada elemento e combinando-o com todos os conjuntos N-1 de (muitas) permutações do subconjunto obtido removendo o elemento.
Eu nunca havia implementado um único solucionador de programação dinâmica - meu conhecimento é aplicado em matemática / física / computação numérica, não em CS - até alguns anos atrás, quando comecei a fazer problemas no Project Euler . Os problemas solucionáveis por DP (por exemplo , 76 , 158 , 161 , 242, mas há muito mais) acabou sendo o meu tipo favorito. Você definitivamente fica melhor identificando quando será uma técnica útil: basicamente, procure coisas que parecem poder ser resolvidas por algum tipo de abordagem recursiva de dividir e conquistar, onde também é possível domar a explosão de caminhos que precisam ser explorado reconhecendo subproblemas recorrentes e reutilizando os resultados calculados anteriormente; ser capaz de identificar o vetor de estado mínimo para memorizar - e que "história" irrelevante pode ser apagada - é o passo crucial.
fonte