Описание проблемы: массив с n -элементами, эти n -элементы могут быть положительными или отрицательными. Найдите сумму самого большого субара.
Метод 1: Метод грубой силы
Идея: Самый простой и простой способ подумать - найти все субрайры, затем найти сумму всех субрайей и получить максимальное значение в сумме всех субррей.
/ *** Метод 1 (метод грубой силы): Найдите сумму максимальных субаррей в двух петлях*/ public static int maxsubarray1 (int [] a) {int i, j; int thissum = 0; int maxsum = 0; for (i = 0; i <a.length; i ++) {thissum = a [i]; for (j = i+1; j <a.length; j ++) {thissum+= a [j]; if (thissum> maxsum) {maxsum = thissum; }} return maxsum; }Метод 2: Оптимизированное динамическое программирование
Идея: Во-первых, в соответствии с отношениями между последним элементом A [N-1] массива и крупнейшим субрайем, его можно разделить на следующие три ситуации:
1) Максимальный субрай содержит [N-1], то есть заканчивается [N-1].
2) A [N-1] Один образует самый большой субрай.
3) Максимальный субрай не содержит [N-1], поэтому найти максимальный субрай [1, ..., N-1] может быть преобразован в поиск максимального субрай [1, ..., N-2].
Благодаря вышеуказанному анализу мы можем сделать следующий вывод: при условии, что сумма наибольшего массива (a [0], ... a [i-1]) была рассчитана как все [i-1], и сумма наибольшего массива [I-1] в (a [0], ... a [i-1]) также рассчитывается как конец [i-1].
Затем можно получить следующие отношения: All [i-1] = max {a [i-1], end [i-1], все [i-1]}. Используйте эту формулу и идею динамического программирования для решения проблем. (Код также решает проблему исходной позиции и окончательной позиции)
/*** Метод 2: Оптимизированный метод динамического программирования* nend получается путем добавления массивов в [i] в последовательности, а затем сравнивая их с [i] "и сохраненным большим. Потому что, если предыдущее число добавляется в [i]* не так велик, как сам, что на самом деле, и в этом, и в этом, и один из них, и один из них, и один из них, и один из них. public static int max (int m, int n) {return m> n? M: n; nend = max (nend+a [i], a [i]); maxsum = integer.min_value; int nstart = 0; for (int i = 0; i <a.length; i ++) {if (nsum <0) {nsum = a [i]; nstart = i; } else {nsum+= a [i]; } if (nsum> maxsum) {maxsum = nsum; begin = nstart; end = i; }} return maxsum; }Выше всего содержание этой статьи. Я надеюсь, что содержание этой статьи поможет всем, кто учится или работа. Я также надеюсь поддержать Wulin.com больше!