Programmazione Dinamica
Michele Stecca, PhD
ITT Barsanti
Queste slide sono state preparate per aiutare gli studenti delle scuole superiori
che devono affrontare le prove territoriali delle Olimpiadi dell’Informatica.
Per qualsiasi segnalazione potete contattare l’autore tramite il suo profilo Twitter:
@steccami
Programmazione Dinamica
E’ una tecnica avanzata di programmazione che permette di ridurre notevolmente
la complessità di alcuni algoritmi.
Esempi:
●
Problemi sui grafi
●
Problemi sulle stringhe
●
Problema dello zaino (versione intera)
●
Massima sottosequenza crescente
●
Ecc.
Programmazione Dinamica
Quando utilizzare la programmazione dinamica?
→ Quando il problema è scomponibile in sottoproblemi non indipendenti tra di
loro (overlapping subproblems)
→ Applicando approcci come divide-et-impera, la complessità esplode a causa
del ricalcolo di soluzioni già ottenute in precedenza.
La PD risolve un sottoproblema in comune una sola volta e riutilizza la soluzione ottenuta ogni
volta che è necessario (potremmo parlare di caching!).
Ricordate Fibonacci?
Programmazione Dinamica
La programmazione dinamica fa
uso di:
●
sottoproblemi sovrapponibili;
●
sottostrutture ottimali;
●
Memoizzazione (aka, caching).
PD nella pratica
1. Utilizzare una struttura di appoggio (matrice,
vettore, ecc.) per i risultati parziali da riutilizzare
2. Definire opportunamente i sottoproblemi
3. Definire le condizioni iniziali
4. Identificare dove troveremo la soluzione
5. Riempire la struttura di appoggio (da condizioni
iniziali a soluzione) in maniera iterativa o ricorsiva
La parte difficile...
2. Definire opportunamente sottoproblemi
La sfida è ridefinire il problema iniziale in
modo tale che l’algoritmo sia efficiente
(Commento: talvolta il “modo” è molto
controintuitivo per gli esseri umani)
Attenzione alla “tentazione Greedy”
- Supponiamo di avere a disposizione un numero
infinito di monete di diverso taglio, per es. 9, 6, 5, 1
- Trovare il numero minimo di monete che
servono per arrivare a una certa somma S:
ES1: 10 = 9 + 1 quindi minimo=2
ES2: 4 = 1 + 1 + 1 + 1 quindi minimo=4
Attenzione alla “tentazione Greedy”
- Un approccio Greedy sembrerebbe sufficiente:
Step 1: ordina per valore decrescente le monete
Step 2: scegli la più grande moneta che non eccede il
valore attuale e sottrai il valore della moneta scelta al
totale.
Step 3: se il valore attuale è >0, torna allo step 2
Attenzione alla “tentazione Greedy”
L’algoritmo Greedy funziona correttamente per
S=10 e S=4 ma...
Se, per es. S=11, l’algoritmo ritorna
“9 + 1 + 1, minimo=3” che NON è la soluzione
ottimale (infatti 11=6+5, minimo=2)
Esempi
Vediamo 3 problemi (di difficoltà crescente)
1. Discesa massima
2. Massima sottosequenza crescente
3. Problema dello zaino
1. Discesa massima (1/2)
Trovare il percorso che massimizzi la somma
dei valori tra la radice e la foglia “migliore”
https://training.olinfo.it/#/task/discesa/statement
1. Discesa massima (2/2)
●
L’approccio Greedy fallisce
●
Complessità esponenziale mediante ricorsione
●
Complessità quadratica mediante PD
2. Massima sottosequenza
crescente
●
Consiste nel trovare una sottosequenza di una sequenza data in cui gli
elementi della sottosequenza siano ordinati dal minore al maggiore e la cui
lunghezza sia la massima possibile.
●
Esempio:
2. Massima sottosequenza
crescente
●
Perchè è difficile?
– La sottosequenza può iniziare in qualsiasi punto
– Tra un elemento e l’altro è possibile saltare un numero arbitrario di elementi
●
Complessità:
– Brute Force: esponenziale
– Programmazione dinamica: quadratica
●
In realtà si può fare di meglio (O(nlogn)) ma serve molta pazienza :-)
(vedi
https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/
LongestIncreasingSubsequence-2x2.pdf)
E Poldo?
https://training.olinfo.it/#/task/poldo/statement
3. Problema dello zaino
Si rimanda alla presentazione del prof. Alberto Montresor (UniTN)
(http://cricca.disi.unitn.it/montresor/teaching/)
3. Problema dello zaino
...tentazione Greedy
Bonus: Floyd-Warshall
[Fonte: Wikipedia]
Calcolo del cammino minimo per tutte
le coppie di nodi in
un grafo pesato e orientato
Reference
Una sola risorsa ma preziosissima…
https://www.geeksforgeeks.org/dynamic-
programming/

Programmazione Dinamica.pdf

  • 1.
  • 2.
    Queste slide sonostate preparate per aiutare gli studenti delle scuole superiori che devono affrontare le prove territoriali delle Olimpiadi dell’Informatica. Per qualsiasi segnalazione potete contattare l’autore tramite il suo profilo Twitter: @steccami
  • 3.
    Programmazione Dinamica E’ unatecnica avanzata di programmazione che permette di ridurre notevolmente la complessità di alcuni algoritmi. Esempi: ● Problemi sui grafi ● Problemi sulle stringhe ● Problema dello zaino (versione intera) ● Massima sottosequenza crescente ● Ecc.
  • 4.
    Programmazione Dinamica Quando utilizzarela programmazione dinamica? → Quando il problema è scomponibile in sottoproblemi non indipendenti tra di loro (overlapping subproblems) → Applicando approcci come divide-et-impera, la complessità esplode a causa del ricalcolo di soluzioni già ottenute in precedenza. La PD risolve un sottoproblema in comune una sola volta e riutilizza la soluzione ottenuta ogni volta che è necessario (potremmo parlare di caching!).
  • 5.
  • 6.
    Programmazione Dinamica La programmazionedinamica fa uso di: ● sottoproblemi sovrapponibili; ● sottostrutture ottimali; ● Memoizzazione (aka, caching).
  • 7.
    PD nella pratica 1.Utilizzare una struttura di appoggio (matrice, vettore, ecc.) per i risultati parziali da riutilizzare 2. Definire opportunamente i sottoproblemi 3. Definire le condizioni iniziali 4. Identificare dove troveremo la soluzione 5. Riempire la struttura di appoggio (da condizioni iniziali a soluzione) in maniera iterativa o ricorsiva
  • 8.
    La parte difficile... 2.Definire opportunamente sottoproblemi La sfida è ridefinire il problema iniziale in modo tale che l’algoritmo sia efficiente (Commento: talvolta il “modo” è molto controintuitivo per gli esseri umani)
  • 9.
    Attenzione alla “tentazioneGreedy” - Supponiamo di avere a disposizione un numero infinito di monete di diverso taglio, per es. 9, 6, 5, 1 - Trovare il numero minimo di monete che servono per arrivare a una certa somma S: ES1: 10 = 9 + 1 quindi minimo=2 ES2: 4 = 1 + 1 + 1 + 1 quindi minimo=4
  • 10.
    Attenzione alla “tentazioneGreedy” - Un approccio Greedy sembrerebbe sufficiente: Step 1: ordina per valore decrescente le monete Step 2: scegli la più grande moneta che non eccede il valore attuale e sottrai il valore della moneta scelta al totale. Step 3: se il valore attuale è >0, torna allo step 2
  • 11.
    Attenzione alla “tentazioneGreedy” L’algoritmo Greedy funziona correttamente per S=10 e S=4 ma... Se, per es. S=11, l’algoritmo ritorna “9 + 1 + 1, minimo=3” che NON è la soluzione ottimale (infatti 11=6+5, minimo=2)
  • 12.
    Esempi Vediamo 3 problemi(di difficoltà crescente) 1. Discesa massima 2. Massima sottosequenza crescente 3. Problema dello zaino
  • 13.
    1. Discesa massima(1/2) Trovare il percorso che massimizzi la somma dei valori tra la radice e la foglia “migliore” https://training.olinfo.it/#/task/discesa/statement
  • 14.
    1. Discesa massima(2/2) ● L’approccio Greedy fallisce ● Complessità esponenziale mediante ricorsione ● Complessità quadratica mediante PD
  • 15.
    2. Massima sottosequenza crescente ● Consistenel trovare una sottosequenza di una sequenza data in cui gli elementi della sottosequenza siano ordinati dal minore al maggiore e la cui lunghezza sia la massima possibile. ● Esempio:
  • 16.
    2. Massima sottosequenza crescente ● Perchèè difficile? – La sottosequenza può iniziare in qualsiasi punto – Tra un elemento e l’altro è possibile saltare un numero arbitrario di elementi ● Complessità: – Brute Force: esponenziale – Programmazione dinamica: quadratica ● In realtà si può fare di meglio (O(nlogn)) ma serve molta pazienza :-) (vedi https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/ LongestIncreasingSubsequence-2x2.pdf)
  • 17.
  • 18.
    3. Problema dellozaino Si rimanda alla presentazione del prof. Alberto Montresor (UniTN) (http://cricca.disi.unitn.it/montresor/teaching/)
  • 19.
    3. Problema dellozaino ...tentazione Greedy
  • 20.
    Bonus: Floyd-Warshall [Fonte: Wikipedia] Calcolodel cammino minimo per tutte le coppie di nodi in un grafo pesato e orientato
  • 21.
    Reference Una sola risorsama preziosissima… https://www.geeksforgeeks.org/dynamic- programming/