连续子数组最大和
2012-05-15 16:31
204 查看
要点:
1。 加上一个正数时,和会增加;加上一个负数时,和会减少;
2。 考虑全为负数的情况;
3。 求最大子数组的位置。
1。 加上一个正数时,和会增加;加上一个负数时,和会减少;
2。 考虑全为负数的情况;
3。 求最大子数组的位置。
#include <iostream> using namespace std; int maxSum(int *a, int n) { int begin=0,end=0; int sum=0,b=0,flag=0,maxf=a[0]; for(int i=0; i<n; i++) { //判断是否全为负数 if(a[i]>=0) flag=1; if(a[i]>maxf) maxf=a[i]; //加上一个正数,和会增加;加上一个负数,和会减少 if(b<0) { b=a[i]; begin=i;//开始下标 } else b+=a[i]; if(sum<b) { sum=b; end=i;//结束下标 } } if(flag) { cout<<"begin:"<<begin<<" "<<"end:"<<end<<endl; return sum; } else //全为负数时 { cout<<"begin:0"<<" "<<"end:"<<n-1<<endl; return maxf; } } void main() { //int a[10]={-11,-8,-6,-3,-1,-5,-7,-2,-10,-1}; int a[10]={1,-8,6,3,-1,5,7,-2,0,1}; cout<<maxSum(a,10)<<endl; }