What is the difference between memoization and tabulation in dynamic programming?
Memoization is top down. You write the recursive solution you already have and add a cache so that each subproblem is computed once and reused. Tabulation is bottom up. You identify the states, write them out in an order where every dependency has already been computed, and fill the table iteratively.
They produce the same answers, and the choice between them is mostly about engineering rather than algorithms.
Memoization has two practical advantages. The code looks like the recursive solution you would write anyway, which makes it easier to derive and to check. And it only computes the states that are actually reachable, so if the input makes most of the state space irrelevant you do not pay for it.
Tabulation has two practical advantages. It uses a predictable, bounded amount of memory, usually a single flat list rather than a dictionary plus a recursion stack. And it has no recursion depth limit, so it will not blow the stack on an input where the recursion is deep, which is the classic reason a memoised Fibonacci fails on a large index even though the answer is trivial to compute bottom up.
The trade-off to name in an interview is that these are not mutually exclusive and the choice follows from the problem. If the state space is huge but only a slice is reachable, memoize. If the recursion depth could be large or you want predictable memory, tabulate. A hybrid is also common: memoize during development for clarity, then rewrite bottom up once the answer is right, because the bottom-up version is often several times faster in practice even when the asymptotics match.