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.