最大子段和
给定由n个整数(可能有负数组成的序列 a1,a2 a3,....an),要在这n个数中选取相邻的一段ai,a(i+1)....aj 使其和最大,当所有整数均为负数时,定义最大字段和为0.
b[j]=max{b[j-1]+a[j],a[j]}
#include <iostream> using namespace std; int a[1001]; int besti,bestj; int MaxSum(int n){ int sum=0,b=0,beg=0; besti=0,bestj=0; for(int i=0;i<n;i++){ if(b>0){ b+=a[i]; }else{ b=a[i]; beg=i; } if(b>sum){ sum=b; besti=beg; bestj=i; } } return sum; } int main(){ int n; while(cin>>n){ memset(a,0,sizeof(a)); for(int i=0;i<n;i++){ cin>>a[i]; } cout<<MaxSum(n)<<endl; cout<<besti<<" "<<bestj<<endl; } return 0; }