Оптимизируйте алгоритм O(n^2)
до O(n log n)
.
Заявление о проблемах
Указанный массив A
из n
положительных целых чисел. Разделите массив на непрерывные подпоследовательности длиной не более k
, так что сумма максимального значения каждой подпоследовательности минимальна. Вот пример.
Если n = 8
и k = 5
, а элементы массива 1 4 1 3 4 7 2 2
, лучшим решением является 1 | 4 1 3 4 7 | 2 2
. Сумма будет max{1} + max{4, 1, 3, 4, 7} + max{2, 2} = 1 + 7 + 2 = 10
.
O (n ^ 2) решение
Пусть dp[i]
будет минимальной суммой, как в постановке задачи для массива подзадач A[0] ... A[i]
. dp[0] = A[0]
и, для 0 < i < n
(dp[-1] = 0
),
// A, n, k, - defined
// dp - all initialized to INF
dp[0] = A[0];
for (auto i = 1; i < n; i++) {
auto max = -INF;
for (auto j = i; j >= 0 && j >= i-k+1; j--) {
if (A[j] > max)
max = A[j];
auto sum = max + (j > 0 ? dp[j-1] : 0);
if (sum < dp[i])
dp[i] = sum;
}
}
// answer: dp[n-1]
O (n log n)?
Автор проблемы утверждал, что это можно было решить в O(n log n)
времени, и есть некоторые люди, которые смогли передать тестовые примеры. Как это можно оптимизировать?