给定一个浮点数的序列,F1,F2,F3,……,Fn(1<=n<=1000),定义P(s,e)(1<=s<=e<=n)为子序列Fi(s=<i<=e)的所有元素的乘积。写一个函数,求P的最大值。输入保证对任意s、e, P不会超过double能表示的数据范围。
比如序列:
-2.5 ,2 ,0, 4 ,0.5 ,10 ,0.1
1 // 最大的子序列积.cpp : 定义控制台应用程序的入口点。 2 3 #include "stdafx.h" 4 5 double max(double a,double b,double c) 6 { 7 double max_v=a; 8 if(b>a) 9 max_v=b; 10 if(c>max_v) 11 max_v=c; 12 return max_v; 13 } 14 15 double min(double a,double b,double c) 16 { 17 double min_v=a; 18 if(b<a) 19 min_v=b; 20 if(c<min_v) 21 min_v=c; 22 return min_v; 23 } 24 25 double Maxmultiple(int count,double *f) 26 { 27 double *Min=new double[count+1];//Max[i]代表以f[i]结尾的最大连续序列的乘积 28 double *Max=new double[count+1];//Min[i]代表以f[i]结尾的最小连续序列的乘积 29 Min[0]=f[0]; 30 Max[0]=f[0]; 31 double max_val=Max[0]; 32 for(int i=1;i<count;i++) 33 { 34 Max[i]=max(f[i],f[i]*Max[i-1],f[i]*Min[i-1]); 35 Min[i]=min(f[i],f[i]*Max[i-1],f[i]*Min[i-1]); 36 if(Max[i]>max_val) 37 max_val=Max[i]; 38 } 39 return max_val; 40 delete [] Max; 41 delete [] Min; 42 } 43 44 void main() 45 { 46 double maxmul; 47 double a[]={2.5,-2,0,4,0.5,10,0.1}; 48 int len=sizeof(a)/sizeof(a[0]); 49 maxmul=Maxmultiple(len,a); 50 printf("maxmul=%f\n",maxmul); 51 }