/*
@Time:2019-40-13
@Author:A fan of Arsenal
@Theme:最大子段和练习
*/
#include<iostream>
using namespace std;
int n,a[50];
int sum=0;
void input()
{
cout<<"请输入数列的大小"<<endl;
cin>>n;
cout<<"请输入数列元素"<<endl;
for(int i=0;i<n;i++)
cin>>a[i];
}
//最大子段和的一般算法
int MaxSubArray()
{
for(int i=0;i<n;i++)
{
int thissum=0;
for(int j=i;j<n;j++)
{
thissum=thissum+a[j];
if(thissum>sum)
{
sum=thissum;
}
}
}
return sum;
}
//最大子段和的分治算法
int MaxSum(int left,int right)
{
if(left==right)
{
return a[left];
}
else
{
int leftsum=0,rightsum=0,sum=0,midsum=0;
int s1=0,s2=0;
int middle=(left+right)/2;
leftsum=MaxSum(left,middle); //求出左边的最大子段和
rightsum=MaxSum(middle+1,right); //求出右边的最大子段和
for(int i=middle;i>=0;i--)//计算s1
{
int t1;
t1=t1+a[i];
if(t1>s1)
{
s1=t1;
}
}
for(int i=middle+1;i<=right;i++)//计算s2
{
int t2;
t2=t2+a[i];
if(t2>s2)
{
s2=t2;
}
}
midsum=s1+s2;
sum=midsum;
if(leftsum>sum)
sum=leftsum;
else sum=rightsum;
}
return sum;
}
int main()
{
input();
cout<<"一般算法最大子段和---"<<MaxSubArray()<<endl;
cout<<"分治算法最大子段和---"<<MaxSum(0,n-1)<<endl;
system("pause");
return 0;
}