Your space complexity (how much memory your code uses) is from two sources. - First, the dp array stores up to entries, one for each subproblem. - Second, the recursive call stack can go levels deep before hitting the base case.
Both contribute space, so overall you use memory. This is the trade-off: you sacrifice space to gain speed.
In practice, space is manageable for most problems. The call stack depth can be a concern for large in languages with limited stack size, but typically it's fine. But what if recursion isn't your style? There's another way.