Let's say you have a function that is a super-slow function. Now there is no way you can optimize the function, what you can do instead is that you can store results from a previous computation and reuse those results in a new computation to find solutions to other problem.
We'll implement finding n-th Fibonacci number problem We'll find out how much time it takes to compute the 40th Fibonacci number. and in the end, we'll make our code 400k times faster. (and yeah you are reading it right)