Dynamické programování je odvětví optimalizace. Stěžejní myšlenkou je rozklad problému na podproblémy, které jsou řešeny a jejich řešení je ukládáno pro další potenciálně možné použití. Metoda je obzvláště vhodná na úlohy, které se dají dělit na podúlohy, které jsou si podobné a mohou se opakovat. V mnoha úlohách jde volit způsob rozkladu na podproblémy. Tato volba může mít vliv na efektivitu celého výpočtu.Dělíme je na: diskrétní vs. spojité deterministické vs.