分治策略解决最大子数组问题

分治策略的思路:

1.将问题分解为一些子问题,其中有的子问题的形式与原问题相同,只是规模更小

2.递归,求解使递归停止的边界条件

3.合并

对于最大子数组问题,

 1 #include <iostream>
 2 using std::cout;
 3 
 4 inline int max(int a,int b,int c){return a>b?(a>c?a:c):(b>c?b:c);}
 5 
 6 int foo(int *p,int len)
 7 {
 8     //递归边界
 9     if(1==len)return *p;
10 
11     //子问题1,求解数组以中点向两侧延伸情况下的最大值
12     int save,i,leftval,rightval;
13     save=leftval=p[len/2-1];
14     rightval=p[len/2];
15     for(i=len/2-2;i>=0;i--)
16     {
17         save+=p[i];
18         if(save>leftval)leftval=save;
19     }
20     save=rightval;
21     for(i=len/2+1;i<len;i++)
22     {
23         save+=p[i];
24         if(save>rightval)rightval=save;
25     }
26     int v1=max(leftval,rightval,leftval+rightval);
27 
28     //递归求解出数组中点两侧分别的最大值
29     int v2=foo(p,len/2);
30     int v3=foo(p+len/2,len-len/2);
31 
32     //合并
33     return max(v1,v2,v3);
34 }
35 
36 
37 int main()
38 {
39     int a[]={-1,2,5,4,-3,-1};
40     cout<<foo(a,6)<<"\n";
41 
42     return 0;
43 }

 

posted @ 2016-08-30 13:28  backinfile  阅读(238)  评论(0编辑  收藏  举报