Оптимизируйте алгоритм 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),
![dp[i] = min(0, i-k+1 <= j <= i)(dp[j - 1] + max{A[j], ..., A[i]})](/img/86b9438b99a1fd484d534fe6267bbd53.gif)
// 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) времени, и есть некоторые люди, которые смогли передать тестовые примеры. Как это можно оптимизировать?