Dividing a problem into the same kind but with a smaller size of input. Once the size is small enough the solution is trivial.
An example of a divide and conquer problem is merge sort, where sorting is done by merging sorted sublists.
When subproblems are repeating. Dynamic programming adds a
memo
object where we remember results to subproblems
(partial solutions) (think: cache).
Example: computing n-th fibonacci number.