Módulo 10 - Memoização e a ideia da programação dinâmica
A ideia da programação dinâmica: de baixo para cima
9 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 12/07/2026
O que você vai aprender
- Entender a construção de baixo para cima da programação dinâmica.
- Preencher uma tabela dos casos pequenos até o grande.
- Resolver o problema dos degraus com DP.
- Ver a mesma ideia no problema do troco.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: A ideia da programação dinâmica: de baixo para cima.
Os objetivos desta aula. Entender a construção de baixo para cima da programação dinâmica. Preencher uma tabela dos casos pequenos até o grande. Resolver o problema dos degraus com DP. Ver a mesma ideia no problema do troco.
Veja o essencial, parte por parte.
Inverter a viagem. Programação dinâmica monta a resposta grande a partir das respostas pequenas.
Os degraus na prática. Traduzir a escada para pseudocódigo é preencher uma tabela com um laço.
A mesma ideia no problema do troco. Identifique os casos base (os menores, cuja resposta você já sabe).
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
Inverter a viagem
A memoização parte do problema grande e desce: para achar fib de 10, ela pede fib de 9 e fib de 8, e vai descendo até bater no caso base, guardando os resultados na volta. A programação dinâmica clássica faz o caminho contrário. Ela começa pelo que já se sabe, os casos base, e sobe: primeiro fib de 2, depois fib de 3, depois fib de 4, sempre usando os dois valores anteriores que já estão na tabela, até chegar em fib de 10. Não há recursão nenhuma; é um laço simples preenchendo uma tabela do começo ao fim. As duas técnicas resolvem o mesmo problema e cortam o mesmo desperdício; mudam só a direção da viagem.
A imagem da escada ajuda a fixar. Suponha que você pode subir um ou dois degraus por vez, e quer saber de quantos jeitos diferentes dá para chegar ao topo. Em vez de pensar no degrau mais alto primeiro, comece de baixo. Ao degrau 1 só dá para chegar de um jeito. Ao degrau 2, de dois jeitos (um mais um, ou um pulo de dois). E ao degrau 3? De onde você pode dar o último passo: do degrau 2 ou do degrau 1. Então os jeitos de chegar ao 3 são a soma dos jeitos de chegar ao 2 e ao 1. Você monta cada degrau a partir dos anteriores, subindo a tabela até o topo.
Os degraus na prática
Traduzir a escada para pseudocódigo é preencher uma tabela com um laço. Você guarda quantos jeitos há de chegar a cada degrau. Começa fixando os casos base: um jeito para o degrau 1, dois jeitos para o degrau 2. Daí em diante, um laço sobe degrau por degrau, e cada posição recebe a soma das duas anteriores. Quando o laço chega ao último degrau, a resposta está lá, pronta. Repare que é exatamente a lógica do Fibonacci, só vestida de escada, e que a construção de baixo para cima dispensa a recursão inteira. É um laço, uma tabela e uma soma, resolvendo em poucos passos o que a versão ingênua faria em milhões.
funcao jeitosDeSubir(n)
se n <= 2 entao
retorne n // 1 degrau: 1 jeito; 2 degraus: 2 jeitos
fim
tabela <- lista de tamanho n + 1
tabela[1] <- 1
tabela[2] <- 2
para i de 3 ate n faca
tabela[i] <- tabela[i - 1] + tabela[i - 2]
fim
retorne tabela[n]
fim
escreva(jeitosDeSubir(4))Um laço preenche a tabela de baixo para cima. Cada degrau é a soma dos dois anteriores; sem recursão.
🎮 Jogo da aula
Quantos jeitos de subir?
Preencha a tabela de baixo para cima (cada degrau é a soma dos dois anteriores) e descubra o resultado.
funcao jeitosDeSubir(n)
se n <= 2 entao
retorne n
fim
tabela <- lista de tamanho n + 1
tabela[1] <- 1
tabela[2] <- 2
para i de 3 ate n faca
tabela[i] <- tabela[i - 1] + tabela[i - 2]
fim
retorne tabela[n]
fim
escreva(jeitosDeSubir(4))A mesma ideia no problema do troco
O troco mostra que a técnica vale muito além do Fibonacci. Imagine que você quer pagar um valor usando o menor número possível de moedas, com certos valores de moeda disponíveis. De baixo para cima, você resolve o troco de todo valor menor primeiro: quantas moedas, no mínimo, para 1, para 2, para 3, e assim por diante, até o valor cheio. Para cada valor, você testa cada moeda e pergunta: se eu usar esta moeda, sobra um valor menor cujo melhor troco eu já calculei e guardei; qual escolha me dá menos moedas no total? A resposta de cada valor se apoia nas respostas dos valores menores, exatamente a subestrutura ótima da aula anterior, e a tabela guarda tudo para não recalcular.
Teste rápido
Qual a diferença central entre a memoização e a programação dinâmica de baixo para cima?
Perguntas frequentes
- Programação dinâmica e memoização são a mesma coisa?
- São dois lados da mesma moeda. Memoização é a recursão com um cache, descendo do problema grande. A programação dinâmica clássica é de baixo para cima, montando a resposta dos casos pequenos até o grande com um laço. As duas resolvem problemas com subproblemas sobrepostos e chegam ao mesmo resultado; mudam a direção.
- Por que a versão de baixo para cima dispensa recursão?
- Porque, quando você resolve um caso, os casos menores de que ele precisa já estão prontos na tabela, calculados antes por você. Não é preciso pedir a ninguém: é só ler as posições anteriores e combinar. Isso vira um laço simples que preenche a tabela do começo ao fim, sem chamadas recursivas.
- O nome dinâmica quer dizer que muda o tempo todo?
- Não. O nome é histórico e não descreve bem a técnica; não tem a ver com algo que muda dinamicamente. Pense nela como preencher uma tabela por partes, dos casos pequenos aos grandes. O importante é a ideia, montar a resposta a partir de respostas menores guardadas, e não a palavra em si.
- O problema dos degraus é mesmo o Fibonacci disfarçado?
- É quase. O número de jeitos de chegar a um degrau é a soma dos jeitos de chegar aos dois degraus anteriores, a mesma regra do Fibonacci. Só mudam os casos base. Muitos problemas de programação dinâmica têm esse ar de família: uma vez que você enxerga a soma dos casos menores, o padrão se repete.
- Como escolho entre descer (memo) e subir (tabela)?
- As duas funcionam. A memoização costuma ser mais fácil de escrever a partir da recursão que você já tem, bastando adicionar o cache. A versão de baixo para cima evita o custo das chamadas e às vezes gasta menos memória. Comece pela que for mais clara para o problema; ambas cortam o mesmo desperdício.
- Preciso decorar como resolver cada problema de DP?
- Não. O mais útil é o roteiro: achar os casos base, descobrir como a resposta se monta a partir dos menores e preencher uma tabela do pequeno ao grande. Com esse roteiro na cabeça, você ataca problemas novos de degraus, troco, caminhos em grade e muitos outros sem decorar soluções prontas.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.