Количество N-значных чисел, у которых побитовое И смежных цифр равно 0

Опубликовано: 22 Сентября, 2022

Для заданного положительного целого числа N задача состоит в том, чтобы подсчитать количество N -значных чисел, таких, что побитовое И смежных цифр равно 0.

Примеры:

Input: N = 1
Output: 10
Explanation: All numbers from 0 to 9 satisfy the given condition as there is only one digit.

Input: N = 3
Output: 264

Наивный подход: самый простой подход к решению данной проблемы состоит в том, чтобы перебрать все возможные N-значные числа и подсчитать те числа, у которых побитовое И смежных цифр равно 0 . После проверки всех чисел выведите в качестве результата значение count .

Временная сложность: O(N × 10 N )
Вспомогательное пространство: O(1)

Эффективный подход. Описанный выше подход также можно оптимизировать с помощью динамического программирования, поскольку в приведенной выше задаче есть перекрывающиеся подзадачи и оптимальная подструктура. Подзадачи можно хранить в таблице dp[][] с помощью мемоизации, где dp[digit][prev] хранит ответ с позиции цифры th до конца, когда предыдущей выбранной цифрой является prev . Выполните следующие шаги, чтобы решить проблему:

  • Определите рекурсивную функцию, скажем, countOfNumbers(digit, prev) , выполнив следующие шаги.
    • Если значение цифры равно N + 1 , то вернуть 1 , так как формируется действительное N-значное число.
    • Если результат состояния dp[digit][prev] уже вычислен, вернуть это состояние dp[digit][prev] .
    • Если текущая цифра 1 , то можно поставить любую цифру из [1, 9] . Если N = 1 , то можно поставить и 0 .
    • В противном случае выполните итерацию по всем числам от i = 0 до i = 9 и проверьте, выполняется ли условие ((i & prev) == 0) или нет, и, соответственно, поместите удовлетворяющие значения «i» в текущую позицию.
    • После корректного размещения рекурсивно вызовите функцию countOfNumbers для индекса (цифра + 1) .
    • Верните сумму всех возможных правильных размещений цифр в качестве ответа.
  • В качестве результата выведите значение, возвращаемое функцией countOfNumbers(1, 0, N) .

Ниже приведена реализация вышеуказанного подхода:

Временная сложность: O(N × 10 2 )
Вспомогательное пространство: O(N × 10)