Problema B - Para Cima e Para Baixo


Tipo de problema: Programação Dinâmica
Autor do Problema: Pedro Ribeiro (DCC/FCUP)

Problema:
De quantas maneiras conseguimos construir o número pedido?

Restrições:
1 <= D <= 1 000.
1 <= M <= 2 000 000 000.


Solução base:
Se soubermos quantos '?' são, podemos fazer esse número de ciclos de 0 até 9 e validar o número.
Gerar os números recursivamente e validar daria aproximadamente 30 pontos.


Gerar só os números válidos:
Conhecendo a solução recursiva anterior, parece evidente que podemos gerar somente os números válidos.
Esta solução daria aproximadamente 50 pontos.


Agrupar '?'s:
Podemos reaproveitar muita coisa!

Imaginem o número 183???583???5.

Conseguem ver onde reaproveitar os cálculos? Só precisamos de calcular o número de possibilidades nos pontos de interrogação uma única vez e multiplicar!

Esta solução daria aproximadamente 70 pontos.


Programação dinâmica:
Na solução anterior já conseguimos perceber que certos cálculos podem ser reaproveitados.

Na realidade, a única coisa que precisamos de saber é:

Pode-se construir esta matriz usando os valores anteriores, e a resposta está indicada no último valor!


Ligações interessantes: