令x1,x2,...,xn是一串实数(不需要一定为正数)。设计一个O(n)的算法,寻找一个(连续的)子序列xi,xi+1...xj,使得他们的乘积在所有子序列乘积中最大。空序列的乘积定义为1.
算法描述:运用加强的归纳算法,如果知道了x1,x2,...,xn-1的乘积最大子序列,分两种情况:
a、那么如果n-1规模的最大子序列中包含xn-1,那么xn>1,则xn属于最大子序列;如果xn<1,那么最大子序列不变。
b、如果n-1归农的最大子序列中不包含xn-1,那么就要考虑几个后最的情况:
i、如果xn>1,就要考虑最大正后缀,如果最大正后缀>原后缀,更新最大序列
ii、如果xn<-1,就要考虑最小负后缀
-
void fmax_mulsque(double x[])
-
{
-
double Nsuffix = 0;//0代表初始无后缀。
-
double Psuffix = 0;
-
max = 1;
-
int i;
-
double tmp;
-
for(i = 0; i < NUM; i++) //NUM数组长度
-
{
-
if(x[i]>1)
-
{ if(Psuffix == 0) Psuffix = x[i];
-
else {
-
Psuffix *= x[i];
-
}
-
if(Psuffix > max) max = Psuffix;
-
if(Nsuffix != 0) Nsuffix *= x[i];
-
}
-
else if(x[i] < -1)
-
{
-
if(Nsuffix == 0) Nsuffix = x[i];
-
else
-
{ tmp = Nsuffix;
-
if(Psuffix !=0) Nsuffix = Psuffix * x[i];
-
else Nsuffix = x[i];
-
Psuffix = tmp * x[i];
-
if(Psuffix > max) max = Psuffix;
-
}
-
}
-
else if(x[i] >= 0)
-
{
-
if(Psuffix*x[i] >=1) Psuffix *= x[i];
-
else Psuffix = 0;
-
if(Nsuffix*x[i] <= -1) Nsuffix *= x[i];
-
else Nsuffix = 0;
-
}
-
else
-
{
-
if(Nsuffix*x[i] >=1) Psuffix *= x[i];
-
else Psuffix = 0;
-
if(Psuffix*x[i] <= -1) Nsuffix *= x[i];
-
else Nsuffix = 0;
-
}
-
-
}
-
}
阅读(2299) | 评论(0) | 转发(0) |