Interview----最长连续乘积字串
题目描述:
给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8。
也就是说,上述数组中,3 0.5 8这3个数的乘积3*0.5*8=12是最大的,而且是连续的。
算法1:
首先,枚举的话,复杂度是 O(N^2)
算法2:O(N)
首先发现这个题与最长连续子数组的和非常类似。
考虑用 D.P. 来求解。
定义 max_vec[i] ----- 以 a[i] 结尾的子数组的最大乘积
min_vec[i] ------ 以 a[i] 结尾的子数组的最小乘积。
为什么要定义 min_vec 呢?? 稍微讲解。。
现在考虑,如何求解 max_vec[i]??
它的值有以下两种可能:
1. a[i]
2. a[i] * 【a[i] 前面连续的若干个元素的乘积】;
1> if a[i] >= 0,为了让乘积最大,我们取 a[i] * max_vec[i-1] 即可;
2> if a[i] < 0, 为了让乘积最大,我们希望 【a[i]前面连续个若干个元素的乘积】越小越好,因此取 a[i] * min_vec[i-1]
从上面的分析,已经证明了 问题的最优子结构,所以 D.P. 可行。
代码如下:
/**
* @file max-multiphy.cc
* @brief max multiphy of a vector
* @author shoulinjun@126.com
* @version 0.1.00
* @date 2014-03-26
*/ #include <iostream>
#include <vector>
using namespace std; double MaxMultiply(double *a, int n)
{
double result(a[0]);
vector<double> max_vec(n), min_vec(n);
max_vec[0] = a[0];
min_vec[0] = a[0]; for(int i=1; i<n; ++i)
{
max_vec[i] = max(a[i], max(a[i]*min_vec[i-1], a[i]*max_vec[i-1]));
min_vec[i] = min(a[i], min(a[i]*min_vec[i-1], a[i]*max_vec[i-1]));
result = max(result, max_vec[i]);
}
return result;
}
Interview----最长连续乘积字串的更多相关文章
- 返回字符串中最长连续相同字串的长度---正则实现与JavaScript实现
JavaScript 实现 let str = 'AAABBAACCAAAADDE' function continuousString(str) { let finalObj = {} let te ...
- 动态规划--求最大连续子数组的和(Python实现)&求解最大连续乘积字串(Python实现)
def MaxSum(self,array,n): sum=array[0] result=array[0] for i in range(0,n): if sum<0: sum=a[i] el ...
- 最长公共字串(LCS)最长连续公共字串(LCCS)
链接1:http://blog.csdn.net/x_xiaoge/article/details/7376220 链接2:http://blog.csdn.net/x_xiaoge/article/ ...
- leetcode-3 最长无重复字串
3. Longest Substring Without Repeating Characters 题面 Given a string, find the length of the longest ...
- 最长连续回文串(最优线性时间O(n))
转自:http://blog.csdn.net/hopeztm/article/details/7932245 Given a string S, find the longest palindrom ...
- 马拉车 o(n)(最长连续回文串) hdu 3068
#include<bits/stdc++.h> ; using namespace std; +]; string manacher(string ss) { string tt=&quo ...
- (字符串)最长公共字串(Longest-Common-SubString,LCS)
题目: 给定两个字符串X,Y,求二者最长的公共子串,例如X=[aaaba],Y=[abaa].二者的最长公共子串为[aba],长度为3. 子序列是不要求连续的,字串必须是连续的. 思路与代码: 1.简 ...
- 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr
问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk ...
- URAL 1517 Freedom of Choice(后缀数组,最长公共字串)
题目 输出最长公共字串 #define maxn 200010 int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; int cmp(int *r,int a,int b, ...
随机推荐
- 在Windows Azure上搭建SSTP VPN
在国内,VPN是用来干嘛的大家都懂的.很久之前我尝试用Azure的Virtual Network搞VPN结果惨败了.最近微博上有基友写了篇文章亲测可行,原文在这里.可惜是英文的.所以我的这篇文章仅仅是 ...
- JS实现会动的小车
2015-06-05怎么说呢,我想要实现的功能是很简单的,但是过程中,遇到不少问题. 我要实现的功能是页面右侧有辆小车,鼠标滚动或者拉动滚动条,小车消失,在底部点击“返还顶部”按钮后,页面缓慢向上滚动 ...
- 《Java程序设计》第七周学习总结
20145224 <Java程序设计>第七周学习总结 教材学习内容总结 13.1 认识时间与日期 ·想要度量时间首先要有时间基准,目前国际上通用的有一下六个时间基准: 1.格林威治标准时间 ...
- hdu-----(4857)逃生(拓扑排序)
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- poj----1330Nearest Common Ancestors(简单LCA)
题目连接 http://poj.org/problem?id=1330 就是构建一棵树,然后问你两个节点之间最近的公共父节点是谁? 代码: /*Source Code Problem: 1330 U ...
- SQL Server数据库(作业)
create datebase zuoye2gouse zuoyegocreate table student --学生表( Sno varchar(20) not null primary key, ...
- 委托传参,lambda
今天一朋友问到一问题,怎么在timer的委托里面传参数,我初一想Invoke 可以传参数吧,我就说了. 后来他说这个委托是微软定义,不能变参数,于是我就自己写了一段代码试 试. 我最初写的代码如下 p ...
- fill_parent和wrap_content的区别
在Android布局文件中定义视图垂直或水平大小: android:layout_width和android_layout_height的属性有fill_parent.wrap_content和mat ...
- python logger
[loggers] keys=root [handlers] keys=consoleHandler [formatters] keys=simpleFormatter [logger_root] l ...
- TreeList用法(1)
本人按照网上搜的一些小用法整理的: 如果要出现左边的效果,代码如下: public DataTable CreateDataTable() { DataTable ...