1 /* 2 A="2,9,-1,3,7,0,8,9,-3",求最大连续乘积子串,有三种方法,方法一:采用动态规划方法,最容易理解,也最容易实现,方法二:同样采用动态规划的 3 思路,但是不用保存两个数组空间。方法三:采用记录最大值,最小值的方法 4 */ 5 6 /* 7 动态规划方法,,两个数组,最大和最小,max[i]以i结尾的序列中最大连续乘积。 8 maxnum[i]=max{maxnum[i-1]*A[i],minnum[i-1]*A[i],A[i]}; 9 minnum[i]=min{maxnum[i-1]*A[i],minnum[i-1]*A[i],A[i]}; 10 maxnum[0]=minnum[0]=A[0]; 11 */ 12 #include <iostream> 13 using namespace std; 14 #include <string> 15 #include <algorithm> 16 double maxmultiply(const double * str,int n) 17 { 18 int size=n; 19 if(size==0) 20 return 0; 21 double * maxnum=new double[size]; 22 if(maxnum==NULL) 23 exit(1); 24 double * minnum=new double[size]; 25 if(minnum==NULL) 26 exit(1); 27 double result=str[0]; 28 maxnum[0]=minnum[0]=str[0]; 29 for(int i=1;i<n;i++) 30 { 31 maxnum[i]=max(max(maxnum[i-1]*str[i],minnum[i-1]*str[i]),str[i]); 32 minnum[i]=min(min(maxnum[i-1]*str[i],minnum[i-1]*str[i]),str[i]); 33 if(maxnum[i]>result) 34 result=maxnum[i]; 35 } 36 delete[] maxnum; 37 delete[] minnum; 38 return result; 39 } 40 41 /* 42 采用动态规划的思路,但是采用两个变量保存max序列和min序列。 43 */ 44 double maxmultiply2(const double * A,int n) 45 { 46 if(A==NULL) 47 return 0; 48 double result=A[0]; 49 double maxnum=A[0],minnum=A[0]; 50 for(int i=1;i<n;i++) 51 { 52 double tmpmax=maxnum*A[i]; 53 double tmpmin=minnum*A[i]; 54 maxnum=max(max(tmpmax,tmpmin),A[i]); 55 minnum=min(min(tmpmax,tmpmin),A[i]); 56 if(maxnum>result) 57 result=maxnum; 58 } 59 return result; 60 } 61 62 //方法三,采用类似观察归纳的方法,maxcurrent,mincurrent ,maxproduct,minproduct ,注意maxcurrent如果小于1要变成1,其实就是好能跟自己比较 63 //其实还是一样的,没啥必要写 64 double maxmultiply3(const double * A,int n) 65 { 66 if(A==NULL) 67 return 0; 68 double maxcurrent=1; 69 double mincurrent=1; 70 double maxproduct=1; 71 double minproduct=1; 72 for(int i=0;i<n;i++) 73 { 74 maxcurrent*=A[i]; 75 mincurrent*=A[i]; 76 if(maxcurrent>maxproduct) 77 maxproduct=maxcurrent; 78 if(mincurrent>maxproduct) 79 maxproduct=mincurrent; 80 if(maxcurrent<minproduct) 81 minproduct=maxcurrent; 82 if(mincurrent<minproduct) 83 minproduct=mincurrent; 84 if(mincurrent>maxcurrent) 85 swap(mincurrent,maxcurrent); 86 if(maxcurrent<1) 87 maxcurrent=1; 88 } 89 return maxproduct; 90 } 91 92 int main() 93 { 94 double A[]={-2.5,4,0,3,0.5,8,-1}; 95 int n=7; 96 cout<<maxmultiply3(A,n)<<endl; 97 system("pause"); 98 }