In
both the approaches you divide a problem into smaller subproblems,
solve them and combine their results to solve the bigger problem. This
breaking up of the problem into subproblems can be several levels deep.
The
difference between the two lies in the nature of subproblems. In divide
and conquer paradigm, all subproblems are independent in nature and
they do not overlap when you keep dividing problems into subproblems,
each subproblem is required to be solved only once.
While
in dynamic programming a subproblem solved as part of one bigger
subproblem may be required to be solved again as part of another
subproblem, so the very first time a subproblem is solved it's results
are tabulated(stored in some efficient datastructure) and the next time
it is encountered instead of solving it again, the result is simply
looked up in the table and returned.