break up a problem into a series of overlapping sub-problems, and build up solutions to larger and larger sub-problems.
an optimization algorithm that breaks down the problem into discrete subproblems and uses the result of all these subproblems to get the final answer. often involves a grid
arrange subproblems in order to solve them only once, uses additional memory to save the solution and minimise computational time