Максимизируйте счет, умножая элементы заданного массива на заданные множители.

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

Даны два массива array[] и multipliers[] размера N и M , где N всегда больше, чем равно M. Необходимо выполнить M операций. В каждой операции выберите multiplier[i] и элемент из массива arr[] либо с начала, либо с конца, скажем, K , затем добавьте multiplier[i]*K к общему счету, скажем, ans , и удалите K из массива arr[ ]. Задача состоит в том, чтобы найти максимальное значение итогового балла .

Примеры:

Input: array[] = {1, 2, 3}, multipliers[] = {3, 2, 1}, N=3, M=3
Output: 14
Explanation: An optimal solution is as follows:
– Choose from the end, [1, 2, 3], adding 3 * 3 = 9 to the score.
– Choose from the end, [1, 2], adding 2 * 2 = 4 to the score.
– Choose from the end, [1], adding 1 * 1 = 1 to the score.
The total score is 9 + 4 + 1 = 14.

Input: array[] = {2, 1}, multipliers[] = {0}, N=2, M=1
Output: 0
Explanation: No matter 2 or 1 is chosen, the answer will be 0 because multiplier[0] equals 0.

Наивный подход: решение грубой силы состоит в том, чтобы рекурсивно проверить каждую пару и найти оптимальное решение.

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

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

Эффективный подход: решение основано на динамическом программировании, поскольку оно содержит как свойства — оптимальную подструктуру, так и перекрывающиеся подзадачи. Предположим, что dp[i][j] — текущий максимальный результат, который можно получить из подмассива, где i — начальный индекс, а j — конечный. На любом этапе есть два варианта:

pick the first: dp[i + 1][j] + curr_weight * array[i]

pick the last: dp[i][j – 1] + curr_weight * array[j]

Результат будет максимальным из обоих. Выполните следующие шаги, чтобы решить проблему, используя поиск в глубину и запоминание:

  • Инициализируйте переменную, оставшуюся как NM .
  • Инициализируйте массив dp[] размера M+1 со значениями 0.
  • Переберите диапазон [0, M), используя переменную i , и выполните следующие шаги:
    • Инициализируйте переменную mm как multipliers[-i-1] .
    • Переберите диапазон [0, Mi), используя переменную j , и выполните следующие шаги:
      • Установите значение dp[j] как максимальное из mm*array[j] + dp[j+1] или mm*array[j+remain] + dp[j].
      • Увеличьте значение остатка на 1.
  • После выполнения вышеуказанных шагов выведите значение dp[0] в качестве ответа.

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

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