1.最大子段和问题。给定由n个整数组成的序列,求序列中子段的最大和,若所有整数均为负整数时定义最大子段和为0。
例如, 当(a1,a2,a3,a4 ,a5,a6) = (-2,11,-4,13,-5,-2)时,最大子段和为: a2+a3+a4=20
输入格式:
第一行输入整数个数n(1≤n≤10000),再依次输入n个整数。
输出格式:
输出第一行为最大子段和,第二行为子段第一个数和最后一个数在整个序列中的位序。
输入样例1:
6
-2 11 -4 13 -5 -2
输出样例1:
20
2 4
#include<iostream>
using namespace std;
int compare(int a[],int n){
int premax=0;
int max=0;
int first,last;
for(int i=1;i<=n;i++){
if(premax+a[i]>=a[i]){
premax=premax+a[i];}
else{
premax=a[i];
first=i;
last=i;
}
if(premax>=max){
max=premax;
last=i;
}
}
if(max<0)
cout<<0<<endl;
else
cout<<max<<endl;
cout<<first<<" "<<last<<endl;
return 0;
}
int main(){
int n;
cin>>n;
int *a=new int[n];
for(int i=1;i<=n;i++){
cin>>a[i];
}
compare(a,n);
return 0;
}