分治策略解决最大子数组问题
分治策略的思路:
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 }