Максимизируйте точку, чтобы уменьшить массив, заменив подмассив его суммой
Учитывая массив arr[] размера N , задача состоит в том, чтобы максимизировать оценку, чтобы уменьшить массив до одного элемента, заменив любой подмассив его суммой, где оценка одной такой операции является произведением длины подмассива и минимального значения этого подмассива.
Примеры:
Input: N = 2, arr[] = {1, 5}
Output: 2
Explanation: Select subarray (0, 1). Then array arr[] become { 6 } and points earned = 2 * min(1, 5) = 2. Total points earned = 2Input: N = 3, arr[] = {2, 3, 5}
Output: 14
Explanation: First select subarray (0, 1), then array arr[] become { 5, 5 } and points earned = 2 * min(2, 3) = 4. Select subarray (0, 1), then array arr[] become { 10 } and points earned = 2* min(5, 5) = 10. Total points earned = 4 + 10 =14.
Подход с использованием суммы префиксов и DP (мемоизация):
The Basic idea to solve this problem statement is to maintain a prefix sum array and obtain sum between range using DP (memoization).
Let there be three elements in the subarray {a, b, c} with b > a > c.
1st Case: If we include all the element at a time. array becomes {a+b+c}, points reward = 3*min(a, b, c) = 3*c.
2nd Case: Now, take two element at a time,
First select subarray(1, 2), array becomes (a, b+c), points reward = 2 * min(b, c) = 2*c
Now select subarray(0, 1), array becomes (a+b+c), points reward = 2 * min(a, b+c) = 2*a
Total points obtained = 2*c + 2*aNow, points obtained in the 2nd case is more than points obtained in the first case as
a > c So 2*a > c. So it is optimal to not choose all of the three at a time and break it into two parts from b. This can be implemented with the help of dynamic programming to store the maximum possible point for a subarray [i, j] for avoiding repreated calculation.
Следуйте шагам, указанным ниже, чтобы реализовать идею:
- Создайте массив суммы префиксов pre[] , чтобы получить сумму между любым диапазоном за время O(1).
- Создайте рекурсивную функцию, которая принимает i и j в качестве параметров, определяющих диапазон группы.
- Итерируйте от k = i до j , чтобы разделить заданный диапазон на две группы.
- Вызовите рекурсивную функцию для этих групп.
- Предположим, что ans1 и ans2 представляют общее количество баллов, полученных за левую и правую части соответственно.
- Теперь для текущего раздела с индексом k потенциальным ответом будет ans1 + ans2 + 2* min(левый элемент, правый элемент), как видно из приведенного выше обсуждения.
- Теперь левый элемент будет pre[k+1]-pre[i] , правый элемент будет pre[j-1] – pre[k+1] , который можно вычислить за время O(1) из суммы префикса множество.
- Максимальное значение, полученное для диапазона от 0 до N-1 , является требуемым ответом.
Ниже приведена реализация описанного выше подхода.
Временная сложность: O(N 2 )
Вспомогательное пространство: O(N 2 )
Статьи по Теме:
- Введение в динамическое программирование — учебные пособия по структуре данных и алгоритмам
- Массив сумм префиксов — реализация и приложения в соревновательном программировании