Можно ли на Лиспе выполнять восходящее динамическое программирование?

Может ли типичный диалект Лиспа решать проблемы, используя восходящее «динамическое программирование» подход?

(Обратите внимание: я не говорю о «мемоизации» , которая, насколько я понимаю, тривиальна при использовании любого диалекта Лиспа. Я действительно говорю о нижнем вверх Динамическое программирование, при котором вы строите, например, свой массив снизу вверх, а затем используете элементы, которые вы только что представили, для вычисления следующих.)

Например, используя динамическое программирование, рюкзак "0-1 « проблема может быть решена за псевдополиномиальное время для входных данных, на которых любой другой метод не сработает.

Обязательное (неполное) решение:

for (int k = 1; k <= a.length; k++) {
    for (int y = 1; y <= b; y++) { 
        if (y < a[k-1]) {
            knap[k][y-1] = knap[k-1][y-1];
        } else {
            if (y > a[k-1]) {
                knap[k][y-1] = Math.max(knap[k-1][y-1], knap[k-1][y-1-a[k-1]] + c[k-1]);
            } else {
                knap[k][y-1] = Math.max(knap[k-1][y-1], c[k-1]);
    }
}

Возможно ли такое в различных диалектах Лиспа? Если нет, то почему?

11
задан Reinstate Monica 19 October 2011 в 16:56
поделиться