Dynamisch programmeren begrijpen: een gids voor het efficiënt oplossen van complexe problemen
DP staat voor ‘Dynamisch Programmeren’. Het is een methode voor het oplossen van complexe problemen door ze op te splitsen in kleinere deelproblemen, elk deelprobleem slechts één keer op te lossen en de oplossingen voor deelproblemen op te slaan om overtollige berekeningen te voorkomen. Met andere woorden, DP is een techniek om problemen recursief op te lossen door ze op te splitsen in kleinere stukjes, waarbij je elk stukje afzonderlijk oplost en vervolgens de oplossingen van de stukjes combineert om het oorspronkelijke probleem op te lossen. Door dit te doen kunnen we overbodige berekeningen vermijden en het probleem efficiënter oplossen. DP is vooral handig voor het oplossen van problemen met overlappende subproblemen, waarbij hetzelfde subprobleem meerdere keren kan voorkomen met verschillende invoer. Door de oplossingen voor deze subproblemen op te slaan, kunnen we voorkomen dat we ze meerdere keren opnieuw moeten berekenen en in plaats daarvan de opgeslagen oplossingen gebruiken om het oorspronkelijke probleem sneller op te lossen. Enkele veel voorkomende kenmerken van DP-problemen zijn onder meer: Optimale substructuur: het probleem kan worden opgesplitst in kleinere subproblemen, en de optimale oplossing voor het grotere probleem kan worden geconstrueerd uit de optimale oplossingen van de subproblemen.
* Overlappende subproblemen: hetzelfde subprobleem kan meerdere keren voorkomen met verschillende invoer.
* Recursie: het probleem kan recursief worden opgelost door het opdelen in kleinere stukjes en elk stuk afzonderlijk oplossen. Voorbeelden van DP-problemen zijn de Fibonacci-reeks, het kortste pad in een grafiek en de langste gemeenschappelijke deelreeks in twee reeksen.