Решаем задачи Python. Джеймс Девис

Чтение книги онлайн.

Читать онлайн книгу Решаем задачи Python - Джеймс Девис страница 10

Жанр:
Серия:
Издательство:
Решаем задачи Python - Джеймс Девис

Скачать книгу

результатов:

      – Возвращаем найденную подпоследовательность, которая является наибольшей невозрастающей подпоследовательностью исходного списка `nums`.

14. Задача поиска наибольшей невозрастающей подпоследовательности в массиве чисел, но с ограничением на разницу между элементами этой подпоследовательности.

      Например, нам нужно найти наибольшую невозрастающую подпоследовательность, где разница между соседними элементами не превышает заданное число `k`.

      Мы можем использовать модифицированный подход динамического программирования для решения этой задачи. Примерный алгоритм:

      1. Создаем список длиной равной длине исходного массива чисел, заполненный единицами. Этот список будет содержать длины наибольших невозрастающих подпоследовательностей, заканчивающихся в каждом элементе исходного массива.

      2. Проходим по каждому элементу исходного массива и сравниваем его со всеми предыдущими элементами.

      3. Если разница между текущим элементом и предыдущим не превышает `k`, то длина наибольшей невозрастающей подпоследовательности, заканчивающейся в текущем элементе, будет равна максимальной длине подпоследовательности, заканчивающейся в предыдущем элементе, плюс 1.

      4. В конце алгоритма находим максимальное значение в списке длин и восстанавливаем саму подпоследовательность.

      Давайте реализуем этот алгоритм на Python:

      ```python

      def find_max_non_increasing_subsequence_with_limit(nums, k):

      n = len(nums)

      # Создаем список для хранения длин наибольших невозрастающих подпоследовательностей

      lengths = [1] * n

      # Заполняем список длин

      for i in range(1, n):

      for j in range(i):

      if nums[i] <= nums[j] and nums[j] – nums[i] <= k:

      lengths[i] = max(lengths[i], lengths[j] + 1)

      # Находим максимальную длину подпоследовательности

      max_length = max(lengths)

      # Восстанавливаем саму подпоследовательность

      subsequence = []

      last_index = lengths.index(max_length)

      subsequence.append(nums[last_index])

      for i in range(last_index – 1, -1, -1):

      if nums[last_index] – nums[i] <= k and lengths[i] == max_length – 1:

      subsequence.append(nums[i])

      max_length -= 1

      last_index = i

      return subsequence[::-1] # Возвращаем подпоследовательность в обратном порядке

      # Пример использования

      nums = [5, 3, 8, 2, 9, 1, 6]

      k = 3

      result = find_max_non_increasing_subsequence_with_limit(nums, k)

      print("Наибольшая невозрастающая подпоследовательность с разницей не более", k, ":", result)

      ```

      Этот код найдет и выведет наибольшую невозрастающую подпоследовательность в списке чисел `[5, 3, 8, 2, 9, 1, 6]`, где разница между соседними элементами не превышает 3.

      Работа с текстом и данными

      Пояснения к коду:

      1. Определение функции `find_max_non_increasing_subsequence_with_limit`:

      – Эта функция принимает список чисел `nums` и число `k`, которое ограничивает разницу между соседними элементами подпоследовательности.

Скачать книгу