给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出
的最大乘积连续子串为3,0.5,8。也就是说,上述数组中,3 0.5 8 这3 个数的乘积3*0.5*8=12
是最大的,而且是连续的。
跟以前写的这道题http://blog.csdn.net/gao1440156051/article/details/43498407
求子数组的最大和很像。
不同点就在于,最小的负数乘以负数可能就变成最大。
用动态规划,状态转化方程为:
Max=max{a, Max[i-1]*a, Min[i-1]*a};
Min=min{a, Max[i-1]*a, Min[i-1]*a};
初始状态为Max[1]=Min[1]=a[1]。
#include <iostream>
#include <cstdlib>
using namespace std;
double max(double a,double maxArry,double minArry){
double maxRes=a;
if(maxArry>maxRes)
maxRes=maxArry;
else if(minArry>maxRes)
maxRes=minArry;
return maxRes;
}
double min(double a,double maxArry,double minArry){
double minRes=a;
if(maxArry<minRes)
minRes=maxArry;
else if(minArry<minRes)
minRes=minArry;
return minRes;
}
double maxSubProduct(double *data,int length){
if(data==NULL)
exit(-1);
double maxRes=data[0];
double *maxArry=new double[length];
double *minArry=new double[length];
maxArry[0]=minArry[0]=data[0];
for(int i=1;i<length;i++){
maxArry[i]=minArry[i]=data[i];
maxArry[i]=max(data[i],maxArry[i-1]*data[i],minArry[i-1]*data[i]);
minArry[i]=min(data[i],maxArry[i-1]*data[i],minArry[i-1]*data[i]);
if(maxArry[i]>maxRes){
maxRes=maxArry[i];
}
}
delete maxArry;
delete minArry;
return maxRes;
}
int main(){
double data[]={-2.5,4,0,3,0.5,8,-1};
int length=7;
cout<<maxSubProduct(data,length)<<endl;
system("pause");
}
结果是12