Классический пример применения динамического программирования для ускорения работы рекурсивной функции. Различные вариации этой задачи часто спрашивают на собеседовании в Google, Amazon и Facebook. Эта задача на LeetCode:
Hide player controls
Hide resume playing