Динамическое программирование

2. Псевдодвумерное динамическое программирование


Псевдодвумерное динамическое программирование — это такой тип задач, в которых уже не достаточно одномерного массива для хранения результатов, а нужен двумерный массив, но при этом одна из его размерностей мала, например, равна двум. В таком случае бывает удобно не заводить двумерный массив, а завести два одномерных массива. Также в таких задачах, как правило, заполнение значений происходит в одномерном цикле.

Задача. Даны два целых числа n>0 и 2k10. Требуется найти количество последовательностей длины n, которые состоят из цифр от 0 до k1 и в которых нет двух подряд идущих нулей.

Пусть dp[i][0] — это количество последовательностей длины i, которые заканчиваются на цифру 0, а dp[i][1] — это количество последовательностей длины i, которые заканчиваются не на цифру 0. Таким образом, мы имеем массив dp[i][j], у которого вторая размерность равна двум.

Начинаем заполнение с последовательностей длины один:

dp[1][0]=1

dp[1][1]=k1

Далее для всех значений i2 можно записать формулы пересчёта:

dp[i][0]=dp[i1][1]