Let me break down memoization into a few simple steps:
Write the recursive solution with base cases.
Add an additional array named dp or memo.
At the start of your function, check if the result is calculated in dp. If so, return it.
Before returning your computed result, store it in dp. That's it. Four steps. You'll use this exact pattern on hundreds of problems and it works every time. You now have a technique that solves a huge portion of dynamic programming problems.