1.暴力求解
#include <iostream>
#define N 100
using namespace std;
int main() {
int array[N];
int i, j, n, sum;
int start, end, maxSum=-99999;
cin>>n;
for(i = 0; i < n; i++)
cin>>array[i];
for(i = 0; i < n; i++)
{
sum = 0;
for(j = i; j < n; j++) {
sum += array[j];
if(sum > maxSum) {
maxSum = sum;
start = i;
end = j;
}
}
}
cout<<"("<<start<<","<<end<<")"<<" "<<maxSum <<endl;
return 0;
}
2.分治思想
#include <cstdio>
#include <iostream>
#define N 100
using namespace std;
int array[N];
typedef struct {
int start;
int end;
int sum;
} MaxSubarray;
MaxSubarray findMaxCrossSubarray(int array[], int low, int mid, int high) {
MaxSubarray maxSubarray;
int sum, maxLeft, maxRight;
int leftSum = -999999, rightSum = -999999;
sum = 0;
for(int i = mid; i >= low; i--) {
sum += array[i];
if(sum > leftSum) {
leftSum = sum;
maxLeft = i;
}
}
sum = 0;
for(int i = mid + 1; i <= high; i++){
sum += array[i];
if(sum > rightSum){
rightSum = sum;
maxRight = i;
}
}
maxSubarray.start = maxLeft;
maxSubarray.end = maxRight;
maxSubarray.sum = leftSum + rightSum;
return maxSubarray;
}
MaxSubarray findMaxSubarray(int array[], int low, int high) {
if(low == high) {
MaxSubarray maxSubarray;
maxSubarray.start = low;
maxSubarray.end = high;
maxSubarray.sum = array[low];
return maxSubarray;
}else{
int mid = (low + high) / 2;
MaxSubarray leftMaxSubarray;
leftMaxSubarray = findMaxSubarray(array, low, mid);
MaxSubarray rightMaxSubarray;
rightMaxSubarray = findMaxSubarray(array, mid+1, high);
MaxSubarray arossMaxSubarray;
arossMaxSubarray = findMaxCrossSubarray(array, low, mid, high);
if(leftMaxSubarray.sum >= rightMaxSubarray.sum && leftMaxSubarray.sum >= arossMaxSubarray.sum) {
return leftMaxSubarray;
} else if(rightMaxSubarray.sum >= leftMaxSubarray.sum && rightMaxSubarray.sum >= arossMaxSubarray.sum) {
return rightMaxSubarray;
} else {
return arossMaxSubarray;
}
}
}
int main() {
int n;
scanf("%d",&n);
for(int i = 0; i <= n; i++)
cin>>array[i];
MaxSubarray maxSubarray = findMaxSubarray(array,0,n-1);
printf("(%d,%d) %d", maxSubarray.start, maxSubarray.end, maxSubarray.sum);
return 0;
}
3.线性时间算法(算法导论习题4.1-5)
#include <iostream>
#define N 100
using namespace std;
typedef struct {
int start;
int end;
int sum;
} MaxSubarray;
MaxSubarray findMaxSubarray(int array[], int length) {
MaxSubarray maxSubarray;
int boundarySum, maxSum;
boundarySum = array[0];
maxSum = array[0];
for(int i = 1; i < length; i++) {
if(boundarySum + array[i] > array[i])
boundarySum += array[i];
else{
maxSubarray.start = i;
boundarySum = array[i];
}
if(boundarySum > maxSum){
maxSubarray.end = i;
maxSum = boundarySum;
}
}
maxSubarray.sum = maxSum;
return maxSubarray;
}
int main () {
int array[N];
int i, n;
cin>>n;
for(i = 0; i < n; i++)
cin>>array[i];
MaxSubarray maxSubrray = findMaxSubarray(array, n-1);
cout<<"("<<maxSubrray.start<<","<<maxSubrray.end<<")"<<" "<<maxSubrray.sum <<endl;
return 0;
}
4.测试数据
16
13 -3 -25 20 -3 -16 -23 18 20 -7 12 -5 -22 15 -4 7