И для вашего дальнейшего обучения, вот еще один способ решить проблему. Мы хотим знать, сколько имеется двоичных строк, в которых ровно on
включенных битов, а off
выключенных битов.
Там есть несколько простых задач, которые нужно решить. N(on, off)
равно единице, если on
и off
оба равны нулю, потому что единственным решением является пустая строка. И если любой из них равен нулю, то ответ будет один, потому что строка, состоящая из всех нулей или всех единиц, уникальна.
Давайте начнем заносить это в таблицу.
on
0 1 2 3 4 5
+---------------------
o 0| 1 1 1 1 1 1
f 1| 1
f 2| 1
3| 1
4| 1
5| 1
6| 1
Теперь, что должно идти в (1, 1)? Что ж, количество двоичных строк, в которых есть один бит включения и один бит отключения, равно количеству таких строк, начинающихся с единицы, плюс количество таких строк, начинающихся с нуля. Итак, у нас есть:
N(1, 1) = N(1, 0) + N(0, 1) = 2
А как насчет N(2, 1) ? Та же сделка:
N(2, 1) = N(1, 1) + N(2, 0) = 3
И мы видим, что аналогично N(x, 1) = N(1, x) = x + 1. Заполняем массив:
on
0 1 2 3 4 5
+---------------------
o 0| 1 1 1 1 1 1
f 1| 1 2 3 4 5 6
f 2| 1 3
3| 1 4
4| 1 5
5| 1 6
6| 1 7
вообще для вкл, выкл не ноль:
N(on, off) = N(on - 1, off) + N(on, off - 1)
что означает, что мы можем заполнить весь этот массив, многократно применяя это правило. Можете ли вы написать программу, которая делает это?
Как только вы это сделаете, вы можете просто прочитать свой ответ из массива в [6, 3]
.
Вы видели этот шаблон в этом массиве раньше? У него есть имя. Подсказка: вы, вероятно, не видели его в виде квадрата.
person
Eric Lippert
schedule
23.01.2018