最大和分治+在线更新+记录位置

#include<iostream>
using namespace std;
int a[1000000];
int max3(int a, int b, int c)
{
	if (a > b)
	{
		if (a > c)
			return a;
		else
			return c;
	}
	else
	{
		if (b > c)
			return b;
		else
			return c;
	}
}
int fenzhi(int a[], int left, int right)
{
	int Maxleft, Maxright;
	int leftc = 0, rightc = 0;
	int Maxleftc = 0, Maxrightc = 0;
	if (left == right)
	{
		if (a[left] > 0) return a[left];
		else return 0;
	}
	int center = (left + right) / 2;
	Maxleft = fenzhi(a, left, center);
	Maxright = fenzhi(a, center + 1, right);

	for (int i = center; i >= left; i--)
	{
		leftc += a[i];
		if (leftc > Maxleftc)
			Maxleftc = leftc;
	}
	for (int i = center + 1; i <= right; i++)
	{
		rightc += a[i];
		if (rightc > Maxrightc)
			Maxrightc = rightc;
	}
	return max3(Maxleft, Maxright, Maxrightc + Maxleftc);
}
int MaxSubseqSum3(int a[], int N) {
	return fenzhi(a, 0, N - 1);
}
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	cout << MaxSubseqSum3(a, n) << endl;
}


#include<iostream>
using namespace std;
int a[1000000];
int main()
{
	int n; cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	int sum = 0, temp = 0;
	for (int i = 0; i < n; i++)
	{
		temp += a[i];
		if (temp > sum)
			sum = temp;
		if (temp < 0)
			temp = 0;
	}
	cout << sum << endl;
}

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int n; cin >> n; vector<int>v(n);
	for (int i = 0; i < n; i++)
	{
		cin >> v[i];
	}
	int sum=0, start=0, left=0,right=0, ans = -1, flag = 1;
	for (int i = 0; i < n; i++)
	{
		sum += v[i];
		if (sum < 0)
		{
			sum = 0;
			start = i + 1;
		}
		else if (sum > ans)
		{
			ans = sum;
			left = start;
			right = i;
		}

	}
	if (ans< 0) {
		printf("0 %d %d", v[0], v[n - 1]);
	}
	else {
		printf("%d %d %d", ans, v[left], v[right]);
	}
}
原文地址:https://www.cnblogs.com/Hsiung123/p/13811920.html