最大子列和问题代码实现,实现代码为c语言,但使用了c++的I/O组件
#include <iostream>
using namespace std;
/*
len = 8
len / 2 = 4
len - len / 2 = 4
* * * * / * * * *
0 len/2-1 len/2 len-1
(a + 0, 4) (a + 4, 4)
len = 7
len / 2 = 3
len - len / 2 = 4
* * * / * * * *
0 len/2-1 len/2 len-1
(a + 0, 3) (a + 3, 4)
*/
int MaxSubSeqSum(int a[], int len) {
if(len > 1) {
//将原序列划分为左右两部分
int MaxOfLeft = MaxSubSeqSum(a, len / 2);
int MaxOfRight = MaxSubSeqSum(a + len / 2, len - len / 2);
int MaxOfBothSides = MaxOfLeft > MaxOfRight ? MaxOfLeft : MaxOfRight;
int MaxToLeft = 0;
int SumToLeft = 0;
for(int i = len / 2 - 1; i >= 0; i--) {
SumToLeft += a[i];
if(SumToLeft > MaxToLeft) MaxToLeft = SumToLeft;
}
int MaxToRight = 0;
int SumToRight = 0;
for(int i = len / 2; i <= len - 1; i++) {
SumToRight += a[i];
if(SumToRight > MaxToRight) MaxToRight = SumToRight;
}
int MaxCross = MaxToLeft + MaxToRight;
return MaxOfBothSides > MaxCross ? MaxOfBothSides : MaxCross;
} else {
return a[0] > 0 ? a[0] : 0;
}
}
int main() {
int n;
int* arr;
cin >> n;
arr = new int[n];
for(int i = 0; i < n; i++)
{
int t;
cin >> t;
arr[i] = t;
}
int maxSum = MaxSubSeqSum(arr, n);
cout << maxSum;
return 0;
}