刚做完题,先把代码放着,有时间在更新
分治算法
#include <iostream>
using namespace std;
#define maxn (int)10e5+5
int array[maxn]={0};
int main()
{
int n;
int i;
int len;
cin>>len;
for(i=0;i<len;++i)
cin>>array[i];
int maxsubsequence_binary(int * ,int left ,int right);
int ans =max(0,maxsubsequence_binary(array,0,len));
cout<<ans<<endl;
}
int maxsubsequence_binary(int *array,int left,int right)
{
int subans=0;
if (left==right)
return max(array[left],0);
int mid=(left+right)/2;
int maxleft=maxsubsequence_binary(array,left,mid);
int maxright= maxsubsequence_binary(array,mid+1,right);
int leftBorderSum(0),rightBoderSum(0);
int maxleftBorderSum(0),maxRightBorderSum(0);
int i;
for(i=mid;i>=left;--i)
{
leftBorderSum+=array[i];
maxleftBorderSum=max(maxleftBorderSum,leftBorderSum);
}
for(i=mid+1;i<right;++i)
{
rightBoderSum+=array[i];
maxRightBorderSum=max(maxRightBorderSum,rightBoderSum);
}
int temp=max(maxleft,maxright);
if(temp>maxleftBorderSum+maxRightBorderSum)
return temp;
else
return maxleftBorderSum+maxRightBorderSum;
}
在线处理算法
int maxSubsequence_online(int* array,int length )
{
int thisSum(0),maxSum(0);
int i;
for (i=0;i<length;++i)
{
thisSum=max(thisSum+array[i],0);
maxSum=max(maxSum,thisSum);
}
return maxSum;
}