最大子序列和(分而治之)

求一个数组中最大的连续子序列的和

这是用的在线处理,今天学了一下用分而治之处理的。
有关于最大子序列和,在线处理

分而治之,就是先把两边处理一下,再把两边连起来处理一下。
举个列子

在这里插入图片描述
主要考虑三点:
1、left到mid的最大和
2、mid+1到right的最大和
3、left到right的最大和
再把三者进行比较。。选出最大的

不停的递归调用,就是因为起始点不知道。

#include <bits/stdc++.h>
using namespace std;
map<int,int>a;
int fun(int left,int right)
{
	if(left >= right) return 0;
	int summax,thismax;
	int mid = (left+right)/2;
	
	int max1 = 0,max2 = 0,max3 = 0;
	for(int i = mid;i >= left;i--){
		max1 += a[i];
		if(max1 > max2)
			max2 = max1;
	}
	max1 = 0;
	for(int i = mid+1;i <= right;i++){
		max1 += a[i];
		if(max1 > max3)
			max3 = max1;
	}
	thismax = max2+max3;
	
	summax = max(fun(left,mid),fun(mid+1,right));
	/*
	cout<<left<<' '<<right<<endl;
	cout<<thismax<<' '<<summax<<endl<<endl;	
	*/
	summax = max(summax,thismax);
	
	return summax;
}
int main()
{
	int n;
	cin >> n;
	for(int i = 0;i < n;i++)
		cin >> a[i];
	int summax = fun(0,n-1);
	cout<<summax<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42868863/article/details/88372334