Это уже на непонятном мне языке. Считайте, что мои представления о массивах - на уровне паскаля.
Тут не про массивы, тут про функции и инкапсуляцию. В одной функции
f мы можем описать другую
g, которая использует переменные, определённые в
f, и вернуть её или как-то иначе отправить вовне (присвоить чему-то, куда-то положить). Тогда создаётся
замыкание (closure) — используемые переменные
f откладываются в некоторую область памяти, которая живёт как минимум столько, сколько живёт выданная ссылка на
g, и
g обращается к ней, когда использует эти переменные. Эта область может делиться между несколькими функциями, которые были определены рядом. При этом всё, что было определено вне
f, никак напрямую обращаться к ней не сможет.
Ну и если вы про динамическое программирование говорили, это довольно большая область, в которой я не разбираюсь, но в простейших случаях типа вычисления членов (а лучше целых кусков) рекуррентных последовательностей сводится к тому, что мы заранее определяем массив нужной длины и вычисляем снизу вверх, от членов с маленькими индексами к членам с большими. При этом после нахождения искомого у нас остаётся куча результатов для меньших значений индексов, которые часто полезно хранить (см. выше) и использовать при очередных запросах, если получится.
Последнее называется ещё одним незнакомым словом —
мемоизация. (В самой сильной постановке задача мемоизации в том, чтобы превратить функцию, не запоминающую значений, в функцию (возможно на уровне машинного языка или байткода), которая запоминает их и использует запомненное; не все языки/фреймворки это дают сделать.)