求一个数组中最大的连续子序列的和
这是用的在线处理,今天学了一下用分而治之处理的。
有关于最大子序列和,在线处理
分而治之,就是先把两边处理一下,再把两边连起来处理一下。
举个列子
主要考虑三点:
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;
}