#include<iostream>
using namespace std;
void manlifa(int a[],int n)
{
int maxsum=0;
for(int i=0;i<n;i++)
{
int sum=0;
for(int j=i;j<n;j++)
{
sum+=a[j];
if(sum>maxsum)
maxsum=sum;
}
}
cout<<"蛮力法:"<<"最大子段和为:"<<maxsum<<endl;
}
int fenzhifa(int a[],int first,int end)
{
if(first==end)
return a[first];
else
{
int sum=0;
int mid=(first+end)/2;
int sumLeft=fenzhifa(a,first,mid);
int sumRight=fenzhifa(a,mid+1,end);
int s1=0,lefts=0;
for(int i=mid;i>=first;i--)
{
lefts+=a[i];
if(lefts>s1)
s1=lefts;
}
int s2=0,rights=0;
for(int i=mid+1;i<=end;i++)
{
rights+=a[i];
if(rights>s2)
s2 = rights;
}
sum=s1+s2;
if(sumLeft>sum)
sum=sumLeft;
if(sumRight>sum)
sum=sumRight;
return sum;
}
}
void dongtaiguihuafa(int a[],int n)
{
int b[n];
int maxsum=0;
b[0]=a[0];
for(int i=1;i<n;i++)
{
if(b[i-1]>0)
b[i]=b[i-1]+a[i];
else
b[i]=a[i];
}
for(int j=0;j<n;j++)
{
if(b[j]>maxsum)
maxsum=b[j];
}
cout<<"动态规划法:"<<"最大子段和为:"<<maxsum<<endl;
}
int main()
{
int n;
cin>>n;
int a[n];
int w=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]<0)
w++;
}
if(w==n)
cout<<"子段和为0"<<endl;
else
{
manlifa(a,n);
cout<<"分治法:";
cout<<"最大子段和为:"<<fenzhifa(a,0,n-1)<<endl;
dongtaiguihuafa(a,n);
}
return 0;
}