Я пытаюсь подойти к проблеме оптимизации с помощью метода заполнения таблицы динамического программирования, но мне не удалось разбить проблему в оптимальных подструктурах.
Это проблема:
С учетом отсортированного массива, начиная с начального элемента, за сколько ходов вы можете уменьшить массив, чтобы иметь только один элемент.
- Вы можете удалить элемент массива, за исключением начального числа, которое рассматривается как 1 ход, это уменьшает массив.
- Вы можете добавить элемент массива, который меньше, чем начальное число, в начальное число. Это считается 1 ход.
- Вы можете добавлять в начальное число, используя предыдущий подход, столько раз, сколько хотите.
- Семя может "потреблять" любой элемент меньше, чем оно. Это уменьшает массив.
например, это отсортированный массив
3, 20, 50, 100, 400
Первый элемент - это семя.
Первый элемент еще не может использовать следующий больший элемент, поэтому нам нужно добавить к нему. В соответствии с ограничениями мы можем добавить все, что меньше семени, за 1 ход. Итак, допустим, мы добавляем 2.
moves = 1
seed = seed + 2
5, 20, 50, 100, 400
все еще seed не может использовать следующий элемент, поэтому давайте добавим 4
moves = 2
seed = seed + 4
9, 20, 50, 100, 400
moves = 3
seed = seed + 8
17, 20, 50, 100, 400
moves = 4
seed = seed + 16
33, 20, 50, 100, 400
теперь семя может "потреблять" следующий элемент
так уменьшенный массив становится
53 (33 + 20) , 50, 100 , 400
53 может потреблять 50 и становиться 103
103, 100, 400
103 может коситься 100 и стать 203
203, 400
203 - это семя, оно не может потреблять 400
так
moves = 5
seed = seed + 202
405, 400
теперь он может потреблять и становиться 805
мы могли бы просто убрать 400, что считается за 1 ход.
всего ходов = 5
Но есть и другое решение: удалить все элементы (20, 50, 100, 400) из массива, что заняло бы 4 хода.
Таким образом, в этом случае минимальное количество ходов равно 4.
Пытаясь думать об этом с точки зрения динамического программирования, я вижу, что на каждом шаге у нас есть 2 варианта: использовать элемент или удалить элемент. Также кажется, что общее количество путей, которое нужно рассмотреть, это все 2 ^ n путей.
но мне не удается разбить его на перекрывающиеся подзадачи или оптимальную подструктуру или даже определить рекуррентное отношение.
Правильное ли здесь динамическое программирование?
Некоторые наблюдения:
- когда нам нужно что-то добавить к начальному числу, наилучшим подходом, кажется, является добавление максимально возможного допустимого значения, которое является начальным значением - 1 * 1059
- как только мы решим удалить элемент, это означает, что последующие элементы также будут удалены. Почему, потому что, если мы приняли решение, что многократное добавление к начальному числу бесполезно для текущего элемента, оно будет справедливо и для следующего большего элемента.