子数组最大累加和(有正有负)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 [1,-2,3,5,-2,6,-1]; 最大子数组为[3,5,-2,6] 和为12,并且能标记处最大子数组的范围 3 */ 4 5 6 #include "stdafx.h" 7 #include <iostream> 8 9 using namespace std; 10 11 void maxSum(int* arr,int len) 12 { 13 if(arr == NULL || len == 0)//合法性判断 14 return ; 15 16 int cursum = 0; //记录遍历过程中的当前和 17 int maxmark = 0x80000000; //记录最大和 18 int begin = 0; //标记和为最大子数组的开始位置 19 int end = 0; //标记和为最大子数组的结束位置 20 21 for(int i = 0; i < len; i++) 22 { 23 cursum += arr[i]; 24 if(cursum <= 0) 25 {//当前和为0,则以下一个位置重新开始 26 cursum = 0; 27 begin = i+1;//标记开始位置 28 } 29 30 maxmark = max(maxmark,cursum); 31 //每一步都记录最大值,保证maxmark不减少 32 33 if(maxmark == cursum) 34 end = i; 35 //向后可能和值还继续大于0,但是已经小于已有的maxNum, //end到此结束。 36 } 37 cout<<begin<<" "<<end<<" "<<maxmark<<endl; 38 } 39 40 int _tmain(int argc, _TCHAR* argv[]) 41 { 42 int arr[] = {1,-2,3,5,-2,6,-1}; 43 maxSum(arr,7); 44 system("pause"); 45 return 0; 46 } 47