您的位置:首页 > 其它

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

2016-08-30 13:28 176 查看
分治策略的思路:

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

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

3.合并

对于最大子数组问题,

#include <iostream>
using std::cout;

inline int max(int a,int b,int c){return a>b?(a>c?a:c):(b>c?b:c);}

int foo(int *p,int len)
{
//递归边界
if(1==len)return *p;

//子问题1,求解数组以中点向两侧延伸情况下的最大值
int save,i,leftval,rightval;
save=leftval=p[len/2-1];
rightval=p[len/2];
for(i=len/2-2;i>=0;i--)
{
save+=p[i];
if(save>leftval)leftval=save;
}
save=rightval;
for(i=len/2+1;i<len;i++)
{
save+=p[i];
if(save>rightval)rightval=save;
}
int v1=max(leftval,rightval,leftval+rightval);

//递归求解出数组中点两侧分别的最大值
int v2=foo(p,len/2);
int v3=foo(p+len/2,len-len/2);

//合并
return max(v1,v2,v3);
}

int main()
{
int a[]={-1,2,5,4,-3,-1};
cout<<foo(a,6)<<"\n";

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: