摘要:类似于求最大子序列的和,将目标改为求积.最重要的改变是在求中间部分时。
(1)最大之积一定是由两边的最小负积相乘或者两边的最大正积相乘得到。因此在这一部分计算量有O(N)->O(4N);当然,总的时间界还是O(NlogN);
static int Maxsub(const int A[],int Left, int Right)
{
int Max_Left,Max_Right;
int center;;
int LeftBodersum[2] = {1},RightBodersum[2] = {1};
int Max_LeftBodersum[2] = {0}, Max_RightBodersum[2] = {0};
int Max_mid;
if (Left == Right)//处理基准情况
{
if (A[Left]>0)
return A[Left];
else
return 0;
}
center = (Left + Right)/2;
Max_Left = Maxsub(A,Left,center);
Max_Right = Maxsub(A,center+1,Right);
for (int i = center;i>=Left;i--)
{
//求解最大正之积
LeftBodersum[Positive] *=A[i];
if (LeftBodersum[Positive] >= Max_LeftBodersum[Positive])
Max_LeftBodersum[Positive] = LeftBodersum[Positive];
//求解最大负之积
LeftBodersum[Negative] *=A[i];
if (LeftBodersum[Negative] <= Max_LeftBodersum[Negative])
Max_LeftBodersum[Negative] = LeftBodersum[Negative];
}
for (int i = center+1;i<=Right;i++)
{
//positive
RightBodersum[Positive] *=A[i];
if (RightBodersum[Positive] >= Max_RightBodersum[Positive])
Max_RightBodersum[Positive] = RightBodersum[Positive];
// negative
RightBodersum[Negative] *=A[i];
if (RightBodersum[Negative] <= Max_RightBodersum[Negative])
Max_RightBodersum[Negative] = RightBodersum[Negative];
}
int a =(Max_LeftBodersum[Positive] * Max_RightBodersum[Positive]);
int b =(Max_LeftBodersum[Negative] * Max_RightBodersum[Negative]) ;
Max_mid = a>b?a:b;
return Max3(Max_Left,Max_Right,Max_mid);
}