最大连续乘积子串

 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 }

转载于:https://www.cnblogs.com/zmlctt/p/3866666.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值