Dynamic Programming

Advanced

Tecnica che risolve problemi complessi suddividendoli in sottoproblemi sovrapposti, memorizzando i risultati intermedi.

Pattern: Dynamic Programming

Il pattern Dynamic Programming (programmazione dinamica) permette di risolvere problemi complessi dividendoli in sottoproblemi più semplici i cui risultati vengono riutilizzati. È particolarmente utile quando i sottoproblemi si ripetono più volte.

🚀 Quando usarlo

Usa la programmazione dinamica quando:

  • Il problema può essere suddiviso in sottoproblemi che si sovrappongono
  • Esiste una struttura ricorsiva o un'ottimizzazione di tipo "scelta ottimale"
  • Vuoi ridurre la complessità da esponenziale a polinomiale memorizzando risultati già calcolati

🧰 Tecniche principali

TecnicaDescrizione
Top-DownUso della memorizzazione (memoization) con ricorsione
Bottom-UpCostruzione iterativa di una tabella di soluzioni

✏️ Esempio classico: Serie di Fibonacci

from functools import lru_cache @lru_cache(maxsize=None) def fib(n): if n < 2: return n return fib(n-1) + fib(n-2)

✅ Complessità:

  • Tempo: O(n)
  • Spazio: O(n)

🧩 Problemi comuni

NomeDifficoltàPatternLink
Fibonacci NumbersEasyTop-DownLeetcode #509
Coin ChangeMediumBottom-UpLeetcode #322
Edit DistanceHardBottom-UpLeetcode #72
Longest Increasing SubsequenceMediumBottom-UpLeetcode #300

💡 Consigli utili

  • Disegna la tabella o l'albero delle chiamate per visualizzare i sottoproblemi
  • Verifica se è possibile ottimizzare lo spazio mantenendo solo le righe o colonne necessarie
  • Usa la memoization solo se i sottoproblemi sono davvero ripetitivi, altrimenti potrebbe non convenire

📚 Continua con

👉 Divide and Conquer →

Unisciti al Viaggio

Ricevi tips settimanali, nuovi pattern e aggiornamenti esclusivi per migliorare costantemente le tue skills algoritmiche

No spam, unsubscribe anytime. Privacy policy compliant.