Максимальная сумма подмассива с одинаковым начальным и конечным элементом

#arrays #algorithm #kadanes-algorithm

#массивы #алгоритм #алгоритм Каданеса

Вопрос:

Я получил онлайн-тестовую задачу, в которой они дали строку символов и значение для каждого символа. Значение каждого символа находится в диапазоне [-10, 10]. Проблема заключалась в том, чтобы найти подстроку, которая начинается и заканчивается одним и тем же символом и имеет максимальное значение. Проблема легко сводится к расширенной версии проблемы максимальной суммы подмассива после замены символов значениями. Ограничение заключается в том, что начальное и конечное значения будут одинаковыми. Я придумал наивное решение и был недостаточно хорош. Кто-нибудь может сказать мне, как решить это с помощью алгоритма Кадане или любого другого с лучшей временной сложностью?

Комментарии:

1. 1) sum(a[i] .. a[j]) = sum(0 .. a[j]) - sum(0 .. a[i-1]) . Таким образом, один O (n) проход предварительной обработки через массив упрощает вычисление любой суммы подмассива за O (1) время. 2) Вместо одного экземпляра алгоритма Кадане вы запускаете 26 экземпляров алгоритма Кадане (по одному на каждую букву). Общее время выполнения составляет O (n).

Ответ №1:

Этот вопрос предназначен для того, чтобы сделать алгоритм Кадане неподходящим.

Тем не менее, вы все еще можете сделать это быстро и легко:

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

  • Для каждой буквы запомните наименьшую предыдущую сумму, виденную до сих пор

  • Для каждой буквы последовательность максимальных значений, которая заканчивается там, начинается с экземпляра той же буквы с наименьшей предыдущей суммой, виденной до сих пор. Обратите внимание, что это может быть та же позиция для последовательности длиной 1.

  • Легко вычислить значение этой наилучшей последовательности, заканчивающейся на каждой букве: letter_value preceding_sum — smallest_preceding_sum_for_same_letter. Запомните самую ценную последовательность, которую вы найдете.