Dinamičko programiranje, kada se odnosi na područje računalne znanosti, opisuje skupinu sličnih računalnih algoritama namijenjenih rješavanju složenih problema razbijanjem problema na skupove manjih problema. Prvo što ga je stvorio Richard Bellman 1950-ih, dinamičko programiranje radi s problemima koji su ili preklapajući podproblemi ili optimalne podstrukture. Da biste razumjeli kako funkcionira dinamičko programiranje, najbolje je razumjeti koncept iza ova dva pojma.
Podproblemi koji se preklapaju opisuju komplicirane jednadžbe koje, kada se razdvoje na manje skupove jednadžbi, više puta koriste dijelove manjih jednadžbi kako bi došli do odgovora. Na primjer, matematička jednadžba za izračunavanje svih mogućih rezultata pomoću skupa brojeva može izračunati isti rezultat više puta, dok druge rezultate izračuna samo jednom. Dinamičko programiranje govorilo bi ovom problemu da nakon prvog izračuna rezultata treba spremiti taj rezultat i kasnije uključiti odgovor u jednadžbu umjesto da ga ponovno izračuna. Kada se radi o dugim složenim procesima i jednadžbama, to štedi vrijeme i stvara brže rješenje uz mnogo manje koraka.
Optimalne podstrukture stvaraju rješenje pronalaženjem najboljeg odgovora na sve podprobleme, a zatim stvaranjem najboljeg ukupnog odgovora. Nakon što složeni problem razbije na manje probleme, računalo zatim pomoću matematičkog sustava odredi koji je najbolji odgovor za svaki problem. Izračunava odgovor na izvorni problem iz manjih odgovora. U ovom procesu postoje nedostaci. Iako daje rješenje koje matematički najbolje funkcionira, ono može, ali ne mora biti najbolje rješenje u stvarnom životu, ovisno o vrsti problema i načinu na koji se odnosi na stvarni svijet.
Tijekom bilo koje od ovih operacija algoritam dinamičkog programiranja pokušava pronaći najkraći put do rješenja. Za to može biti potreban jedan od dva pristupa. Pristup odozgo prema dolje rastavlja jednadžbu na manje jednadžbe i ponovno koristi odgovore za te jednadžbe kada je to potrebno. Pristup odozdo prema gore pokušava riješiti najmanju matematičku vrijednost nakon razbijanja jednadžbe, a zatim se kreće prema najvećoj odatle. Oba pristupa štede vrijeme, ali dinamičko programiranje funkcionira samo kada se izvorni problem može rastaviti na manje jednadžbe koje se u nekom trenutku ponovno koriste za rješavanje jednadžbe.