задача по информатике Вовочке надо построить забор из досок длиной в 20 метров. На каждый метр забора может быть прибито не более одной доски. Важным условием является то, что на первом и последнем метре забора обязано быть по доске. При этом Вовочка может не пропускать, пропускать 3 или 7 метра подряд (но не более), то есть на этих метрах он не прибивает доски. Необходимо помочь Вовочке посчитать - сколькими способами он сможет построить забор. Можно считать, что у него в распоряжении есть любое необходимое количество досок.
Эта задача может быть решена с помощью динамического программирования. Мы можем создать массив dp, где dpiii будет представлять число способов построить забор длиной i метров при заданных условиях.
Шаги к решению:
Инициализация:
У нас есть забор длиной 20 метров. Поэтому массив dp будет иметь размер 21 индексыот0до20индексы от 0 до 20индексыот0до20.Установим начальные условия: dp000 = 0 нетзаборовдлиной0нет заборов длиной 0нетзаборовдлиной0, dp111 = 1 одинспособ—поставитьдоскуна1метродин способ — поставить доску на 1 метродинспособ—поставитьдоскуна1метр и dp222 = 1 доскана1−ми2−мметрахдоска на 1-м и 2-м метрахдоскана1−ми2−мметрах.
Заполнение массива:
Для длины забора от 3 до 20 метров, мы будем использовать рекуррентное соотношение: dpiii = dpi−1i-1i−1 + dpi−2i-2i−2 + dpi−3i-3i−3Здесь: dpi−1i-1i−1 соответствует случаю, когда последняя доска стоит на 1 метре приэтомна<code>i</code>−омметребудетдоскапри этом на <code>i</code>-ом метре будет доскаприэтомна<code>i</code>−омметребудетдоска.dpi−2i-2i−2 соответствует случаю, когда последние две доски стоят на 2-х метрах доскана<code>i−1</code>ина<code>i</code>доска на <code>i-1</code> и на <code>i</code>доскана<code>i−1</code>ина<code>i</code>.dpi−3i-3i−3 соответствует случаю с последними тремя метрами в заборе.
Условия:
Необходимо учитывать, что для i=0 у нас нет заборов. Для i=1, i=2 и i=3 мы уже учли.Для других длины забора мы просто подставляем значения выше.Пример реализации:# Инициализация массива n = 20 dp = 000 * n+1n + 1n+1 # Установка начальных условий dp111 = 1 # 1 способ if n >= 2: dp222 = 1 # 1 способ if n >= 3: dp333 = 2 # 2 способа: 1,1,11,1,11,1,1 и 1,21,21,2 # Заполнение массива for i in range4,n+14, n + 14,n+1: dpiii = dpi−1i - 1i−1 + dpi−2i - 2i−2 + dpi−3i - 3i−3 # Получаем количество способов для 20 метров printdp[20]dp[20]dp[20]Результат
Если вы выполните этот код, он выдаст число способов построить забор длиной 20 метров с учетом всех условий, установленных в задаче Вовочки.
Эта задача может быть решена с помощью динамического программирования. Мы можем создать массив dp, где dpiii будет представлять число способов построить забор длиной i метров при заданных условиях.
Шаги к решению:Инициализация:
У нас есть забор длиной 20 метров. Поэтому массив dp будет иметь размер 21 индексыот0до20индексы от 0 до 20индексыот0до20.Установим начальные условия: dp000 = 0 нетзаборовдлиной0нет заборов длиной 0нетзаборовдлиной0, dp111 = 1 одинспособ—поставитьдоскуна1метродин способ — поставить доску на 1 метродинспособ—поставитьдоскуна1метр и dp222 = 1 доскана1−ми2−мметрахдоска на 1-м и 2-м метрахдоскана1−ми2−мметрах.Заполнение массива:
Для длины забора от 3 до 20 метров, мы будем использовать рекуррентное соотношение:dpiii = dpi−1i-1i−1 + dpi−2i-2i−2 + dpi−3i-3i−3Здесь:
dpi−1i-1i−1 соответствует случаю, когда последняя доска стоит на 1 метре приэтомна<code>i</code>−омметребудетдоскапри этом на <code>i</code>-ом метре будет доскаприэтомна<code>i</code>−омметребудетдоска.dpi−2i-2i−2 соответствует случаю, когда последние две доски стоят на 2-х метрах доскана<code>i−1</code>ина<code>i</code>доска на <code>i-1</code> и на <code>i</code>доскана<code>i−1</code>ина<code>i</code>.dpi−3i-3i−3 соответствует случаю с последними тремя метрами в заборе.
Условия:
Необходимо учитывать, что для i=0 у нас нет заборов. Для i=1, i=2 и i=3 мы уже учли.Для других длины забора мы просто подставляем значения выше.Пример реализации:# Инициализация массиваn = 20
dp = 000 * n+1n + 1n+1
# Установка начальных условий
dp111 = 1 # 1 способ
if n >= 2:
dp222 = 1 # 1 способ
if n >= 3:
dp333 = 2 # 2 способа: 1,1,11,1,11,1,1 и 1,21,21,2
# Заполнение массива
for i in range4,n+14, n + 14,n+1:
dpiii = dpi−1i - 1i−1 + dpi−2i - 2i−2 + dpi−3i - 3i−3
# Получаем количество способов для 20 метров
printdp[20]dp[20]dp[20]Результат
Если вы выполните этот код, он выдаст число способов построить забор длиной 20 метров с учетом всех условий, установленных в задаче Вовочки.