·Ö±ðÓüòµ¥ÊµÏÖ£¨±È½ÏÈÝÒ×Àí½âµ«Ê±¼ä¸´ÔӶȽϸߣ©¡¢·ÖÖη¨¡¢¶¯Ì¬¹æ»®·¨ÊµÏÖ
[java]
public class MaxSum {
// ×î´ó×Ӷκͼòµ¥Ëã·¨
public static void maxSumSimp(int arr[], int bestx, int besty) {
int n = arr.length, sum = 0;
for (int i = 1; i <= n; i++) {
int thissum = 0;
for (int j = i; j <= n; j++) {
thissum += arr[j - 1];
if (thissum > sum) {
sum = thissum;
bestx = i;
besty = j;
}
}
}
System.out.println("¼òµ¥Ëã·¨×îÓÅÖµ£º" + sum);
System.out.println("×îÓŽ⣺" + bestx + "-->" + besty);
}
// ×î´ó×ӶκͷÖÖÎʵÏÖ
public static int maxSumDiv(int[] arr, int left, int right) {
int sum = 0;
if (left == right) {
sum = arr[left] > 0 arr[left] : 0;
} else {
int center = (left + right) / 2;
int leftSum = maxSumDiv(arr, left, center);
int rightSum = maxSumDiv(arr, center + 1, right);
int s1 = 0;
int lefts = 0;
for (int i = center; i >= left; i--) {
lefts += arr[i];
if (lefts > s1) {
s1 = lefts;
}
}
int s2 = 0;
int rights = 0;
for (int i = center + 1; i <= right; i++) {
rights += arr[i];
if (rights > s2) {
s2 = rights;
}
}
sum = s1 + s2;
if (sum < leftSum) {
sum = leftSum;
}
if (sum < rightSum) {
sum = rightSum;
}
}
return sum;
}
// ×î´ó×ӶκͶ¯Ì¬¹æ»®·¨ÊµÏÖ
public static void maxSumDp(int[] arr) {
int sum = 0, b = 0, n = arr.length, bestx = 0, besty = 0;
for (int i = 1; i <= n; i++) {
if (b > 0) {
b += arr[i - 1];
} else {
b = arr[i - 1];
bestx = i;
}
if (b > sum) {
sum = b;
besty = i;
}
}
System.out.println("¶¯Ì¬¹æ»®Ëã·¨×îÓÅÖµ£º" + sum);
System.out.println("×îÓŽ⣺" + bestx + "-->" + besty);
}
public static void main(String[] args) {
int[] arr = { 2,5,-3,4,-9,44,32,22,11,-30 };
for (int i : arr) {
System.out.print(i + " ");
}
System.out.println();
System.out.println("×î´ó×Ӷκͣº");
System.out.println("·ÖÖÎËã·¨×îÓÅÖµ£º" + maxSumDiv(arr, 0, arr.length - 1));
System.out.println("====================");
maxSumDp(arr);
System.out.println("====================");
maxSumSimp(arr, 0, 0);
}
}
public class MaxSum {
// ×î´ó×Ӷκͼòµ¥Ëã·¨
public static void maxSumSimp(int arr[], int bestx, int besty) {
int n = arr.length, sum = 0;
for (int i = 1; i <= n; i++) {
int thissum = 0;
for (int j = i; j <= n; j++) {
thissum += arr[j - 1];
if (thissum > sum) {
sum = thissum;
bestx = i;
besty = j;
}
}
}
System.out.println("¼òµ¥Ëã·¨×îÓÅÖµ£º" + sum);
System.out.println("×îÓŽ⣺" + bestx + "-->" + besty);
}
// ×î´ó×ӶκͷÖÖÎʵÏÖ
public static int maxSumDiv(int[] arr, int left, int right) {
int sum = 0;
if (left == right) {
sum = arr[left] > 0 arr[left] : 0;
} else {
int center = (left + right) / 2;
int leftSum = maxSumDiv(arr, left, center);
int rightSum = maxSumDiv(arr, center + 1, right);
int s1 = 0;
int lefts = 0;
for (int i = center; i >= left; i--) {
lefts += arr[i];
if (lefts > s1) {
s1 = lefts