最大连续乘积子串

 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 }

最大连续乘积子串,布布扣,bubuko.com

时间: 2024-12-18 04:18:05

最大连续乘积子串的相关文章

动态规划题目(三)——最大连续乘积子串

动态规划题目(三)--最大连续乘积子串 1. 题目描述 给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8.也就是说,上述数组中,3 0.5 8这3个数的乘积30.58=12是最大的,而且是连续的. 2. 动态规划求解 动态规划求解题目的时候最重要的是要找到状态转移方程! 针对这道题目,我们使用两个变量记录当前最大值maxEnd, 和当前最小值minEnd.为什么记录当前最小值呢?因为数组中会出现负数,乘以一个负数的话

算法学习(十二)最大连续乘积子串、字符串编辑距离

最大连续乘积子串 题目描述:给一个浮点数序列,取最大乘积连续子串的值,例如-2.5,4,0,3,0.5,8,-1,则取出的最大乘积子串为3,0.5,8.也就是说,上述数组中,3,0.5,8这3个数的乘积3*0.5*8 = 12是最大的,而且是连续的. 分析: 注意子串和字序列的区别. 子串:是串的连续的部分. 子序列:是串中不改变顺序,但是是去掉个别元素的到新的序列. 1,连续数的乘积,最简单的就是穷举法,就是区间[i-j]之间的数的乘积,和最大值max比较,最后输出max.但是时间复杂度很大几

第28章:最大连续乘积子串

-2.5 4 0 3 0.5 8 -1Ans:(3,0.5,8) template<typenameComparable> Comparable maxprod(constvector<Comparable>& v) { int i; Comparable maxProduct =1; Comparable minProduct =1; Comparable maxCurrent = 1; Comparable minCurrent =1; for(inti=0;i<

LeetCode -- 最大连续乘积子序列

问题描写叙述: 给定数组,找出连续乘积最大值的子序列.比如 0,-1,-3.-2.则最大连续乘积为6= (-3) * (-2) 实现思路此题与最大连续和的子序列问题相似,也可通过找到递推公式然后用DP来解.关键在于求公式的过程要考虑到元素可能为负的情况.如果元素都为正数的话,DP公式为:dp[i] = max(a[i],dp[i-1]*a[i]) ,乘或不乘,取最大的那个可元素可能为负数.因此能够使用min和max分别存当前最大值和最小值,如果当前元素为负数的话,当前最小值就成了最大值.这样一来

连续递增子串最长长度的数学期望

参考 [1]: longest consecutive subsequence of a random permutation     第一个帖子:         Theorem: The expected length of the longest increasing block in a random permutation of {1,2,…,n} is r0(n)+O(1) as n→∞, where r0(n) is the smallest positive integer su

找出所有最长连续重复子串及其个数

问题描述: 找出字符串中所以最长连续重复子串及其个数 比如:输入:123234,最大连续重复字符串为23,个数为2 输入:5555,最大连续重复字符串为555,个数为2 输入:aaabbb 最大连续重复字符串为aa,个数为2:和bb,个数为2 必须存在重复的字符串才算,只出现一次的不算.可能存在多个相同长度的不同字符串,比如aaabbb. 分析:最直接的想法是利用两个指针循环遍历比较所有可能的子串,记录下所有子串长度,然后找到所有最大连续子串及其个数,时间复杂度为O(n^2).在网上看到一种利用

两个字符串的最长连续公共子串

LCS(Longest Common Subsequence) 就是求两个字符串最长公共子串的问题.引入: LCS(Longest Common Subsequence) 就是求两个字符串最长公共子串的问题. 比如: String str1 = new String("adbccadebbca");  String str2 = new String("edabccadece");str1与str2的公共子串就是bccade. 解法就是用一个矩阵来记录两个字符串中所

spoj687 后缀数组重复次数最多的连续重复子串

REPEATS - Repeats no tags A string s is called an (k,l)-repeat if s is obtained by concatenating k>=1 times some seed string t with length l>=1. For example, the string s = abaabaabaaba is a (4,3)-repeat with t = aba as its seed string. That is, the

【poj3693-重复次数最多的连续重复子串】后缀数组

题意:给定一个串,长度<=10^5,求它重复次数最多的连续重复子串(输出字典序最小的那个). 例如ccabcabc,答案就是abcabc 一开始没想清楚,结果调了好久. 对于当前的L,i,i+1,x=s[i*L],y=s[(i+1)*L],找前找后,知道了最早能匹配到t0,最晚能匹配到t1,因为不知道当前的起始点是真正循环节的第几个点,所以我们要往前找L个点看看它们是不是真正的起始点. 细节就看代码吧: #include<cstdio> #include<cstdlib> #