借鉴《编程之美》书上的思想,利用动态规划,只需要O(N)的复杂度
假设从原数组a第i位开始的最大不连续子数组和为m[ i ],有m[ i ] = max(a[ i ] + m[ i+2 ], m[ i+1 ])。
#include <iostream>
using namespace std;
int max(int x, int y)
{
return (x>y)?x:y;
}
int maxsum(int *a, int n)
{
int m2=0;
int m1=a[n-1];
for(int i=n-2; i>=0; i--)
{
if(m2<0)//处理最后一位为负数或全为负数的情况
m2=0;
int tmp=m1;
m1=max(a[i]+m2,m1);
m2=tmp;
}
return m1;
}
void main()
{
int a[10]={1,5,3,9,-2,-7,-5,-8,-1,-10};
cout<<maxsum(a,10)<<endl;
}