#include <iostream>
#include <windows.h>
using namespace std;
//算中间的部分
int midCount(int a[], int i, int j)
{
int mid = (i + j) / 2;
int max = 0;
int all = 0;
for (int lengthLeft = mid - 1; lengthLeft >= i; lengthLeft--)
{
all += a[lengthLeft];
max = (all > max ? all : max);
}
all = max;
for (int lengthRight = mid; lengthRight < j; lengthRight++)
{
all += a[lengthRight];
max = (all > max ? all : max);
}
return max;
}
int getMaxSonline(int a[], int i, int j)
{
int mid = (i + j) / 2;
int left;
int midCountMath;
int right;
int max = 0;
int all = 0;
if (i + 1 == j || i == j)
{
return a[i];
}
else
{
midCountMath = midCount(a, i, j);
left = getMaxSonline(a, i, mid - 1);
right = getMaxSonline(a, mid, j);
max = left > right ? left : right;
max = max > midCountMath ? max : midCountMath;
return max;
}
}
int main()
{
int n;
cin >> n;
int a[n];
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int max = getMaxSonline(a, 0, n);
cout << max << endl;
system("pause");
return 0;
}
最大子列和——分而治之(mooc浙江大学数据结构)
最新推荐文章于 2024-09-21 09:30:54 发布