Количество N-значных чисел, абсолютная разница между соседними цифрами которых не увеличивается.

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

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

Примеры:

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: 495

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

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

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

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

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

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