来源http://blog.csdn.net/huangxy10/article/details/8087430
来源:编程之美2.24
一些典型的测试用例:
[1,-2,3,5,-3,2] max=8
[0,-2,3,5,-1,2] max =9
[-2,-4,-3] max=-2
这是一个动态规划问题,设当前扫描到arr[i]
则summax= max( arr[i], maxendinghere, maxsofar);
其中maxendinghere = max( maxendinghere+arr[i], arr[i]).
所以时间复杂度O(n),空间复杂度O(1).
- #include <iostream>
- using namespace std;
- //dp算法
- int maxsum(int *arr,const size_t len)
- {
- if( len<0 )return 0;
- int maxendinghere = arr[0];
- int maxsofar = arr[0];
- for(size_t i=1;i<len;++i)
- {
- maxendinghere = max(maxendinghere+arr[i],arr[i]);
- maxsofar = max(maxsofar,maxendinghere);
- }
- return maxsofar;
- }
- int main()
- {
- int arr[] = {-31,-41,4,-3,4,-1,-97,-93,-23,-84};
- cout<<"MAX:"<<maxsum(arr, sizeof(arr)/sizeof(int));
- return 0;
- }
- 以下是另一种解法,并输出子数组所在位置
#include <stdio.h> #include <iostream> #include <assert.h> using namespace std; int start_index; int end_index; int maxsum(int* parray,int length) { assert(parray!=NULL&&0!=length); int nstart=parray[length-1]; int nall=parray[length-1]; int ret=0; for (int i=length-2;i>=0;i--) { if (nstart<0) { nstart=0; } nstart+=parray[i]; if (nstart>nall) { if (ret==0) { end_index=i; } nall=nstart; ret++; start_index=i; } } return nall; } void test() { int array[]={1,3,-9,6,-4,5,7,-1}; int sum=maxsum(array,8); for (int i=start_index;i<=end_index;i++) { cout<<"("<<array[i]<<")"<<"+"; } cout<<"="<<sum<<endl; } int main() { test(); system("pause"); return 0; }