#include <iostream>
using namespace std;
void manlifa(int a[],int n){
int maxsum = 0;
int cnt = 0;
int sum =0;
int count = 0;
for(int k=0;k<n;k++){
if(a[k]<0){
cnt++;
}
}
if(cnt==n){
cout<<"蛮力法:最大子段和为:"<<maxsum<<endl;
return ;
}
for(int i=0;i<n;i++){
sum = 0;
for(int j=i+1;j<n;j++){
count ++;
sum += a[j];
}
if(sum>maxsum){
maxsum=sum;
}
}
cout<<endl;
cout<<endl;
cout<<"蛮力法:最大子段和为:"<<maxsum<<endl;
cout<<"蛮力法:处理次数:"<<count<<endl;
return ;
}
int maxsum(int a[],int left, int right,int &count){
int sum=0,midsum=0,leftsum=0,rightsum=0;
int center,s1,s2,lefts,rights;
count++;
if(left==right){
sum=a[left];
}
else{
center = (left+right)/2;
leftsum = maxsum(a,left,center,count);
rightsum = maxsum(a,center+1,right,count);
s1=0;lefts=0;
for(int i=center;i>=left;i--){
lefts+=a[i];
if(lefts>s1){
s1=lefts;
}
}
s2=0;rights=0;
for(int j=center+1;j<=right;j++){
rights += a[j];
if(rights>s2){
s2 = rights;
}
}
midsum = s1 + s2;
if(midsum<leftsum){
sum = leftsum;
}
else{
sum=midsum;
}
if(sum<rightsum){
sum=rightsum;
}
}
return sum;
}
void maxsum1(int a[],int n){
int b[n];
int sum=0;
int cnt = 0;
b[0]=a[0];
for(int i=1;i<n;i++){
if(b[i-1]>0){
cnt++;
b[i]=b[i-1]+a[i];
}
else{
cnt++;
b[i]=a[i];
}
}
for(int j=0;j<n;j++){
if(b[j]>sum){
sum=b[j];
}
}
cout<<endl;
cout<<endl;
cout<<"动态规划法:最大子段和为:"<<sum<<endl;
cout<<"动态规划法:处理次数:"<<cnt<<endl;
}
int main() {
int a[6]={-5,3,-4,9,-1,6};
manlifa(a,6);
int count=0;
int sum=0;
sum = maxsum(a,0,5,count);
cout<<endl;
cout<<endl;
cout<<"分治法:最大子段和为:"<<sum<<endl;
cout<<"分治法:处理次数:"<<count<<endl;
maxsum1(a,6);
return 0;
}