Поскольку в задаче не указана длина клетки, рассмотрим стандартную интерпретацию: нужно посчитать, сколько способов уложить прямоугольное полотно длиной n единиц и высотой 1 единица (то есть 1×n) блоками длин 2, 3 и 5 (неограниченное количество каждого блока). Это обычная задача по раскладке одной линии.
Пошаговое решение
- Обозначение
- Пусть a(n) — количество способов уложить полосу длиной n единиц.
- Блоки имеют длины 2, 3 и 5 и располагаются вдоль длины полосы (нет разворота по высоте, так как высота полосы равна 1).
- Расклад последнего блока
- Любой разрез вдоль полосы заканчивается некоторым последним блоком:
- если последний блок длины 2, то перед ним осталось полоса длиной n−2;
- если последний блок длины 3, то перед ним осталось n−3;
- если последний блок длины 5, то перед ним осталось n−5.
- Следовательно, возникнет рекуррентное выражение: a(n) = a(n−2) + a(n−3) + a(n−5).
- Базовые случаи
- Для отрицательных n и нуля: a(0) = 1 (пустая укладка существует как один способ).
- Неположительные длины нулевой или отрицательной полосы, которые требуют дополнений, трактуем как 0 вариантов: a(n) = 0 для n < 0.
- Рассмотрим конкретно первые значения, используя формулу:
- a(1) = a(−1) + a(−2) + a(−4) = 0
- a(2) = a(0) = 1
- a(3) = a(1) + a(0) = 0 + 1 = 1
- a(4) = a(2) + a(1) = 1 + 0 = 1
- a(5) = a(3) + a(2) + a(0) = 1 + 1 + 1 = 3
- Пример вычисления (маленькие n)
- n = 0: a(0) = 1
- n = 1: a(1) = 0
- n = 2: a(2) = 1
- n = 3: a(3) = 1
- n = 4: a(4) = 1
- n = 5: a(5) = 3
- n = 6: a(6) = a(4) + a(3) + a(1) = 1 + 1 + 0 = 2
- n = 7: a(7) = a(5) + a(4) + a(2) = 3 + 1 + 1 = 5
- n = 8: a(8) = a(6) + a(5) + a(3) = 2 + 3 + 1 = 6
- n = 9: a(9) = a(7) + a(6) + a(4) = 5 + 2 + 1 = 8
- n = 10: a(10) = a(8) + a(7) + a(5) = 6 + 5 + 3 = 14
- Как посчитать быстро на больших n
- Можно использовать динамическое программирование (DP):
- создать массив dp длины n+1, dp[0] = 1, dp[i] = 0 для i>0;
- для i от 1 до n: если i≥2 добавляем dp[i] += dp[i−2], если i≥3 добавляем dp[i] += dp[i−3], если i≥5 добавляем dp[i] += dp[i−5].
- ответ: dp[n].
- Сложность: время O(n), память O(n) (или O(1), если держать только последние 5 значений — rolling array).
- Варианты интерпретации
- Если задача подразумевает укладку не в одну строку, а в прямоугольник и разрешены повороты блоков (то есть можно ставить 1×k вертикально, что превращает задачу в двумерную раскладку), то формула и подход будут иными и потребуют другой модели. Уточните параметры (размерность секции и можно ли поворачивать блоки), и я приведу решение под ваш вариант.
Если хотите, скажите n (длину полосы), и я посчитаю a(n) конкретно для вашего значения или приведу таблицу значений до нужного n. Также могу привести простой код на любом языке для вычисления a(n).