Backtracking-ul explorează TOT — și adesea recalculează aceleași subprobleme de mii de ori. Programarea dinamică le rezolvă o SINGURĂ dată și le ține minte. Iar acolo unde Greedy dă greș (mai știi monedele 1/3/4?), ea găsește mereu optimul.
Îți amintești din clasa a X-a (recursivitate) că fib naiv explodează. Hai să vedem DE CE — și cum DP îl salvează.
😱 naiv — recalculează totul
😌 cu memoizare — ține minte
Aceeași idee, două direcții. Tabelarea (de jos în sus) e favorita BAC-ului — o umplem pas cu pas:
Monede de 1, 3 și 4. Vrei suma S cu cât mai PUȚINE monede. Greedy ia mereu cea mai mare — și uneori greșește. DP nu greșește niciodată.
dp[x] = numărul MINIM de monede pentru suma x (∞ = imposibil, deocamdată)
Ai un rucsac de capacitate G și obiecte cu greutate și valoare. Iei fiecare obiect ÎNTREG sau deloc, ca să maximizezi valoarea. DP pe două direcții.
Cinci întrebări despre programarea dinamică.
Programarea dinamică, condensată.
Trei probleme de DP, în C++.