Две проблемы решить подобные проблемы решаются с последовательностью последовательности, приведенной для удовлетворения определенных математических характеристик (максимальные и / продукта максимума), даже если не требуется выходную последовательность.
Ключевая фраза обратить внимание: containing at least one numberтак что есть по крайней мере , данные элементы последовательности, которые также могут вдохновить нас в качестве специального лечения.
А мысль: $ сумма [J] $ является крупнейшим подфрагментом до J элементов последовательности и подзадач, чтобы решить, как, за $ суммы [п] $, по сравнению с ответом. Тем не менее, как использовать $ суммы [1, 2, ..., J-1] $ до $ суммы [J] $ решить эту проблему? Очевидно, что необходимо знать максимальное поле и бывшие J-элементный начальный и конечный подфрагмент позиции, решая проблему субгосударственного перехода явно сложнее.
Поместите это еще одна мысль. Две идей: $ суммы [J] $ являются максимальными подотрезками с первым концом -го элемента детского подотрезка и решения проблем, $ Max_ {1 Leq J Leq п} (суммы [у]) $ являются всем и самые крупные последовательности суб-сегмента. Через $ суммы [J-1] $ $ текущий элемент и НУМС [J] , можно вычислить по $ -го элемента наибольший суб-сегмент и заканчивая $ суммы [J] $, 状态转移方程следующим образом : . $$ суммы [J + 1 ] = {начинаются случаи} НУМС [ J + 1] , суммы [J] 0 Lt кр суммы [J] + НУМС [J + 1] другие случаи {конец} $$
класс { общественности : INT maxSubArray ( вектор < INT > & НУМС) { INT SizeofNums = nums.size (); если (SizeofNums == 1 ) { возврата НУМС [ 0 ]; } INT суммы [SizeofNums]; суммы [ 0 ] = НУМС [ 0 ]; для ( Int я = 1 ; г <SizeofNums; я ++) { сумм [I] = [сумм я -1 ] < 0 ? НУМС [I]: суммы [я -1 ] + НУМС [I]; }
INT largestSum = сумма [ 0 ]; для ( INT I = 1 ; г <SizeofNums; я ++) { если (largestSum <суммы [я]) { largestSum = суммы [I]; } } Вернуть largestSum; } };
Для того , чтобы получить largestSumпоследовательности , соответствующие переменной , что мы можем startIdxзаписать J-й элемент в конец ( endIdxисходное положение) , а максимальная подсегмент соответствующих суб-последовательностей, $ НУМС [startIdx, ..., endIdx] $ представляет собой соответствующую последовательность; Кроме того, принимая во внимание текущее состояние и предыдущее состояние только соответствующий , он может быть использован вместо переменных массива, сохранить память, избегая при этом получать The largest sum of the whole arrayповторные циклы времени.
Процесс решения проблем по существу аналогична предыдущему вопросу, но основная проблема должна быть решена заключается в следующем: переходное состояние, то есть, как (макс продукт с J-го элемента является концом суб-сегмента) рассчитывается на основе ответов на суб-проблемы результаты текущей подзадачи.