For example, when a = {-2,11, -4,13, -5, -2}, the maximum sub-segment sum is 20.
1 #include<iostream> 2 using namespace std; 3 4 #define N 100 5 6 int maxsum1(int *a,int n)//动态规划算法 7 { 8 int sum=0,b=0; 9 for(int i=1;i<=n;i++) 10 { 11 if(b>0)b+=a[i]; 12 else b=a[i]; 13 if(b>sum)sum=b; 14 } 15 return sum; 16 } 17 18 int maxsubsum(int *a,int left,int right) 19 { 20 int sum=0; 21 if(left==right) sum=a[left]>0?a[left]:0; 22 else 23 { 24 int center=(left+right)/2; 25 int leftsum=maxsubsum(a,left,center); 26 int rightsum=maxsubsum(a,center+1,right); 27 int s1=0; 28 int lefts=0; 29 for(int i=center;i>=left;i--) 30 { 31 lefts+=a[i]; 32 if(lefts>s1)s1=lefts; 33 } 34 int s2=0; 35 int rights=0; 36 for(int i=center+1;i<=right;i++) 37 { 38 rights+=a[i]; 39 if(rights>s2)s2=rights; 40 } 41 sum=s1+s2; 42 if(sum<leftsum)sum=leftsum; 43 if(sum<rightsum)sum=rightsum; 44 } 45 return sum; 46 } 47 48 int maxsum(int *a,int n)//分治算法 49 { 50 return maxsubsum(a,1, n); 51 } 52 53 54 int main () 55 { 56 int a [N], n; 57 cin >> n; 58 for ( int i = 1 ; i <= n; i ++ ) 59 cin >> a [i]; 60 cout << " divide and conquer algorithm: " << maxsum (a, n) << endl; 61 cout << " dynamic programming algorithm: " << maxsum1 (a, n) << endl; 62 return 0 ; 63 }