Это взято из упражнения 4.1-5 книги «Введение в алгоритмы». Поскольку этот вопрос и его ответ решают это. Я думаю, что это может быть полезно.
«Используйте следующие идеи для разработки нерекурсивного алгоритма с линейным временем для задачи максимального субарама. Начните с левого конца массива и продвигайтесь вправо, отслеживая максимальный субарак, видимый до сих пор. Зная максимальный подмассиво A [1, j], продолжим ответ, чтобы найти максимальный субаракс, заканчивающийся индексом j + 1, используя следующее наблюдение: максимальный подмассив A [1 .. j + 1] является либо максимальным подрамника A [1 .. j] или подмассива A [i .. j +1], для некоторого 1 < = i < = j + 1. Определить максимальный подмассив формы A [i ... j + 1 ] в постоянное время, основанное на знании максимального подмассива, заканчивающегося индексом j. "
Ответ Сначала мы должны выяснить максимальный вспомогательный массив заканчивая индексом J + 1, который может быть только A [J + 1] или максимальное подмассив заканчивая J плюс A [J + 1], поэтому мы находим максимум этих двух.
После того, как мы получим максимальный вспомогательный массив, заканчивающийся индексом j + 1, мы снова найдем максимум A [1..j + 1], получив максимум между максимальным подвариантом, заканчивающимся индексом j + 1 и максимальным подмассивом A [1..j].
Таким образом, в основном идея заключается в том, что максимальный вспомогательный массив заканчивается с текущим индексом каждой итерации и получает максимум между этим и максимальным значением предыдущей итерации.
Также я думаю, что это неправильно
Edit: Это будет зависеть от определения, если массив не должен содержать, по крайней мере, одно положительное число. В противном случае у вас все в порядке.
max_ending = max(0, max_ending + number);
должно быть:
max_ending = max(number, max_ending + number);
max_ending Также и max_so_far должны начинаться с цифр [0] и петли с индексом 1, если вы будете следовать ми изменения.
Сложность для этого алгоритма O (п)
Дополнительное примечание: В вашей версии нет необходимости, чтобы получить максимальное между числом и max_ending + номер, потому что max_ending> = 0, так число < = номер + max_ending
Это просто: вы просто продолжаете суммирование. Всякий раз, когда сумма падает ниже нуля, это означает, что лучше отказаться от текущего значения и снова начать суммирование. –