Для решения задачи о количестве последовательностей из нулей и единиц длины N, в которых никакие три единицы не стоят рядом, можно воспользоваться методом динамического программирования.
Обозначим через ( f(n) ) количество таких последовательностей длины ( n ). Для удобства рассмотрим также вспомогательные функции:
- ( a(n) ) — количество последовательностей длины ( n ), оканчивающихся на 0.
- ( b(n) ) — количество последовательностей длины ( n ), оканчивающихся на 10.
- ( c(n) ) — количество последовательностей длины ( n ), оканчивающихся на 110.
Таким образом, общее количество последовательностей длины ( n ) можно выразить как:
[ f(n) = a(n) + b(n) + c(n) ]
Теперь необходимо определить рекуррентные соотношения для ( a(n) ), ( b(n) ) и ( c(n) ):
( a(n) ) — последовательность длины ( n ), оканчивающаяся на 0, может быть получена:
- из любой последовательности длины ( n-1 ), оканчивающейся на 0,
- из любой последовательности длины ( n-1 ), оканчивающейся на 10,
- из любой последовательности длины ( n-1 ), оканчивающейся на 110.
Таким образом:
[ a(n) = a(n-1) + b(n-1) + c(n-1) ]
( b(n) ) — последовательность длины ( n ), оканчивающаяся на 10, может быть получена:
- из любой последовательности длины ( n-2 ), оканчивающейся на 0.
Следовательно:
[ b(n) = a(n-2) ]
( c(n) ) — последовательность длины ( n ), оканчивающаяся на 110, может быть получена:
- из любой последовательности длины ( n-3 ), оканчивающейся на 0.
Следовательно:
[ c(n) = a(n-3) ]
Начальные условия:
- ( a(1) = 1 ) (единственная последовательность: "0")
- ( a(2) = 2 ) (возможные последовательности: "00", "10")
- ( a(3) = 4 ) (возможные последовательности: "000", "100", "010", "110")
- ( b(2) = 1 ) (единственная последовательность: "10")
- ( b(3) = 1 ) (единственная последовательность: "010")
- ( c(3) = 1 ) (единственная последовательность: "110")
Теперь можно вычислить ( f(n) ) для любого ( n ) от 1 до 40, используя данные рекуррентные соотношения.
Пример реализации на Python:
def count_sequences(n):
if n == 1:
return 2 # "0", "1"
if n == 2:
return 4 # "00", "01", "10", "11"
a = [0] * (n + 1)
b = [0] * (n + 1)
c = [0] * (n + 1)
a[1] = 1
a[2] = 2
a[3] = 4
b[2] = 1
b[3] = 1
c[3] = 1
for i in range(4, n + 1):
a[i] = a[i-1] + b[i-1] + c[i-1]
b[i] = a[i-2]
c[i] = a[i-3]
return a[n] + b[n] + c[n]
# Пример использования
N = int(input("Введите N: "))
if N > 40:
print("N не должно превышать 40.")
else:
print(count_sequences(N))
Этот алгоритм эффективно вычисляет количество последовательностей для заданного ( N ), используя динамическое программирование.