Максимизируйте сумму выбранных чисел из массива, чтобы очистить его | Набор 2

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

Учитывая массив arr[] из N целых чисел, задача состоит в том, чтобы максимизировать сумму выбранных чисел по всем операциям так, чтобы в каждой операции выбрать число A i , удалить одно его вхождение и удалить все вхождения A i – 1 и A i + 1 (если они существуют) в массиве до тех пор, пока массив не станет пустым.

Примеры:

Input: arr[] = {3, 4, 2}
Output: 6
Explanation: In 1st operation, select 4 and delete it. Therefore, all occurrences of 3 and 5 are deleted from arr[]. The array after the operation is arr[] = {2}. In 2nd operation select 2. Hence, the sum of all selected numbers = 4+2 = 6 which is the maximum possible.

Input: arr[] = {2, 2, 3, 3, 3, 4}
Output: 9
Explanation: In 1st operation, select 3 and delete it. Therefore, all occurrences of 2 and 4 are deleted from arr[]. The array after the operation is arr[] = {3, 3}. In 2nd and 3rd operation select 3. Hence, the sum of all selected numbers = 3+3+3 = 9, which is the maximum possible.

Подход: Данную задачу можно решить, подсчитав частоту элементов массива, а затем найдя максимальную сумму, о которой шла речь в предыдущем посте этой статьи.

Временная сложность: O(M + F), где M — максимальный элемент массива, а F — максимальная частота элемента массива.
Вспомогательное пространство: O(M), где M — максимальный элемент массива.

Подход динамического программирования. Вышеупомянутый подход также можно оптимизировать и решить с помощью динамического программирования. Можно заметить, что если число A i из массива arr[] выбрано, оно внесет A i * freq[A i ] в окончательную сумму. Используя это наблюдение, выполните следующие шаги, чтобы решить данную проблему:

  • Создайте массив freq[] , в котором хранится частота каждого элемента массива arr[] .
  • Создайте одномерный массив dp[] , где dp[i] представляет максимально возможную сумму выбранных значений, лежащих в диапазоне [1, i] в данном массиве.
  • Для каждого значения i возможны два следующих случая:
    • Случай 1, где выбрано i . В этом случае значение dp[i] = freq[i] * i + dp[i-2] .
    • Случай 2, где выбрано i – 1 . В этом случае значение dp[i] = dp[i-1] .
  • Следовательно, отношение DP вышеупомянутой проблемы:

dp[i] = max( dp[i – 1], (freq[i] * i)+ dp[i – 2]) for all values of i in range [0, MAX] where MAX is the maximum integer in arr[]

  • Значение, хранящееся в dp[MAX] , является требуемым ответом.

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

Временная сложность: O(M + F), где M максимальный элемент массива .
Вспомогательное пространство: O(M), где M максимальный элемент массива .