Без трёх единиц
Определите количество последовательностей из нулей и единиц длины N (длина — это общее количество нулей и единиц), в которых никакие три единицы не стоят рядом.
Входные данные
Дано натуральное число N, не превосходящее 40.
Выходные данные
Выведите количество искомых последовательностей. Гарантируется, что ответ не превосходит 231−1.
Примеры
Ввод
Вывод
3
7
C/C++
С++ Без трёх единиц
Динамическим программированием за 1 проход:
int n;
long t[40][4] = {0};
t[0][0] = 1;
t[0][1] = 1;
cin >> n;
for (int i = 1; i < n; ++i) {
t[i][0] = t[i - 1][0] + t[i - 1][2];
t[i][1] = t[i - 1][0] + t[i - 1][2];
t[i][2] = t[i - 1][1] + t[i - 1][3];
t[i][3] = t[i - 1][1];
}
cout << t[n - 1][0] + t[n - 1][1] + t[n - 1][2] + t[n - 1][3];
Просто рассматриваем два очередных числа последовательности как биты двоичного числа диапазона 0..3. При добавлении нового числа дописываем его справа и отбрасываем бит слева. И считаем кол-во способов, которым можем получить каждую комбинацию двух битов.
00 + 0 => 00
10 + 0 => 00
00 + 1 => 01
10 + 1 => 01
01 + 0 => 10
11 + 0 => 10
01 + 1 => 11
11 + 1 => запрещено, три единицы подряд
Т. к. t[i][0] и t[i][1] всегда равны, можно упростить:
int n;
long t[40][3] = {0};
t[0][0] = 1;
cin >> n;
for (int i = 1; i < n; ++i) {
t[i][0] = t[i - 1][0] + t[i - 1][1];
t[i][1] = t[i - 1][0] + t[i - 1][2];
t[i][2] = t[i - 1][0];
}
cout << t[n - 1][0] * 2 + t[n - 1][1] + t[n - 1][2];
int n;
long t[40][4] = {0};
t[0][0] = 1;
t[0][1] = 1;
cin >> n;
for (int i = 1; i < n; ++i) {
t[i][0] = t[i - 1][0] + t[i - 1][2];
t[i][1] = t[i - 1][0] + t[i - 1][2];
t[i][2] = t[i - 1][1] + t[i - 1][3];
t[i][3] = t[i - 1][1];
}
cout << t[n - 1][0] + t[n - 1][1] + t[n - 1][2] + t[n - 1][3];
Просто рассматриваем два очередных числа последовательности как биты двоичного числа диапазона 0..3. При добавлении нового числа дописываем его справа и отбрасываем бит слева. И считаем кол-во способов, которым можем получить каждую комбинацию двух битов.
00 + 0 => 00
10 + 0 => 00
00 + 1 => 01
10 + 1 => 01
01 + 0 => 10
11 + 0 => 10
01 + 1 => 11
11 + 1 => запрещено, три единицы подряд
Т. к. t[i][0] и t[i][1] всегда равны, можно упростить:
int n;
long t[40][3] = {0};
t[0][0] = 1;
cin >> n;
for (int i = 1; i < n; ++i) {
t[i][0] = t[i - 1][0] + t[i - 1][1];
t[i][1] = t[i - 1][0] + t[i - 1][2];
t[i][2] = t[i - 1][0];
}
cout << t[n - 1][0] * 2 + t[n - 1][1] + t[n - 1][2];
Стоит завести строку из "0" и "1". Каждый раз эту строку изменяешь на новое состояние (новую последовательность).
В цикле пробегаешь строку с шагом в три. И проверяешь для трех элементов, что все они равны "1". Если такое встретилось, то continue для основного цикла и переход в новое состояние, если не встретилось, то +1 счетчик.
В цикле пробегаешь строку с шагом в три. И проверяешь для трех элементов, что все они равны "1". Если такое встретилось, то continue для основного цикла и переход в новое состояние, если не встретилось, то +1 счетчик.
Михаил Карасёв
Можно конечно и с битами работать, если умеешь. Тогда берешь число от 0 до (2^(N+1)-1) и три его бита проверяешь на равенство 1.
Если ты решаешь курс Сириус. Информатика. Регионы. Ноябрь 2021. 7–8 класс, то присоединяйся к беседе по ссылке: tinyurl.com/2wsb3994
Похожие вопросы
- Вывести на экран n первых простых чисел, начиная с единицы. n вводится с клавиатуры.
- С++. Почему в методе set_union единица повторяется несколько раз? Код и скриншот ниже
- Сколько раз нужно взять остаток от деления числа на кол-во единиц в его двоичном представлении, чтобы получить 0
- С++ Максимум трёх чисел Даны три целых числа. Найдите наибольшее из них (программа должна вывести ровно одно целое число
- Выполните сортировку массивов ТРЕМЯ СПОСОБАМИ: методом пузырька, прямого поиска и быстрой сортировкой. С++
- Выполните сортировку массивов ТРЕМЯ СПОСОБАМИ: методом пузырька, прямого поиска и быстрой сортировкой. С++
- Даны координаты трех точек на плоскости.
- Последовательности из 0, 1 и 2 без двух единиц и двоек подряд
- Если есть одно направленый стек и двух направленый то почему нет трех направленого по аналогии с многомерными масивами?
- Мне нужно узнать реальную мощность трех колонок в советских единицах измерения. Пример: Radiotehnika S-90 - 35Вт х 1кан.