n = длина. k = максимальное количество последовательных значений. Слово длины i допустимо, если оно имеет не более k последовательных значений.
Пусть f (i, j) = количество допустимых слов длины i, оканчивающихся j гласными.
f(0,0) = 1.
f(i,0) = 21 * (sum from j=0 to min(i-1,k) of f(i-1,j)), for i>0.
f(i,j) = 5*f(i-1, j-1) for 1 <= j <= k.
Решение представляет собой сумму от j = 0 до k из f (n, j).
Это занимает O (k) памяти и O (n * k) времени. Полная таблица - O (nk), но вам нужно только сохранить предыдущую строку на каждом шаге, где строки имеют длину, как в примере ниже.
Пример таблицы для n = 5, k = 2
0 1 2
0 1 n/a n/a
1 21 5 n/a
2 546 105 25
3 14,196 2,730 525
4 366,471 70,980 13,650
5 9,473,121 1,832,355 354,900
Результат: сумма последней строки 11 660 376