Dynamic planning 3. The largest sub-segment and

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 }

 

Guess you like

Origin www.cnblogs.com/yuanqingwen/p/12753801.html