题目描述:

给定一个浮点数序列(可能有正数、0和负数),求出一个最大的连续子序列乘积。

分析:若暴力求解,需要O(n^3)时间,太低效,故使用动态规划。

设data[i]:第i个数据,dp[i]:以第i个数结尾的连续子序列最大乘积,

若题目要求的是最大连续子序列和,则易确定状态转移方程为:

dp[i]=max(data[i],dp[i-1]+data[i])(dp[i]为以第i个数结尾的连续子序列最大和)

但乘积存在负负得正的问题,即原本很小的负数成了一个负数反而变大了,(负数逆袭了),

故不能照抄加法的转移方程,为了解决这个问题,需要定义两个数组:

dp1[i]:以第i个数结尾的连续子序列最大乘积

dp2[i]:以第i个数结尾的连续子序列最小乘积

转移方程:

dp1[i]=max(data[i],dp1[i-1]*data[i],dp2[i-1]*data[i]);

dp2[i]=min(data[i],dp1[i-1]*data[i],dp2[i-1]*data[i]);

最后遍历dp1得到最大值即为答案。

代码如下:

#include<stdio.h>
double max(double a,double b){return a>b?a:b;}
double min(double a,double b){return a<b?a:b;}
double dp1[100001];
double dp2[100001];
double data[100001];
double helper(double data[],int n)
{
dp1[0]=data[0];
dp2[0]=data[0];
for(int i=1;i<n;i++)
{
dp1[i]=max(data[i],max(dp1[i-1]*data[i],dp2[i-1]*data[i]));
dp2[i]=min(data[i],min(dp1[i-1]*data[i],dp2[i-1]*data[i]));
}
double ans=dp1[0];
for(int i=1;i<n;i++)
{
ans=max(ans,dp1[i]);
}
return ans;
} int main(void)
{
int i,n;
while(scanf("%d",&n)!=EOF)
{
for(i=0; i<n; ++i)
{
scanf("%lf", &data[i]);
}
double ans = helper(data, n);
printf("%lf\n",ans);
}
return 0;
}

其实还可以对空间复杂度进行化简,代码如下:

double helper(double data[], int n)
{
double ans = data[0];
double localMax = data[0];
double localMin = data[0];
for(int i=1; i<n; ++i)
{
double t1 = max(data[i], max(localMax*data[i], localMin*data[i]) );
double t2 = min(data[i], min(localMax*data[i], localMin*data[i]) ); localMax = t1;
localMin = t2; ans = localMax > ans ? localMax : ans;
} return ans;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

动态规划:最大连续子序列乘积 分类: c/c++ 算法 2014-09-30 17:03 656人阅读 评论(0) 收藏的更多相关文章

  1. APP被苹果APPStore拒绝的各种原因 分类: ios相关 app相关 2015-06-25 17:27 200人阅读 评论(0) 收藏

    APP被苹果APPStore拒绝的各种原因 1.程序有重大bug,程序不能启动,或者中途退出. 2.绕过苹果的付费渠道,我们之前游戏里的用兑换码兑换金币. 3.游戏里有实物奖励的话,一定要说清楚,奖励 ...

  2. AFNetworing进行POST上传 分类: ios技术 2015-04-01 17:03 73人阅读 评论(0) 收藏

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //申明返回的结果是json类型 m ...

  3. 转自知乎,亲民好酒推荐 分类: fool_tree的笔记本 2014-11-08 17:37 652人阅读 评论(0) 收藏

    这里尽量为大家推荐一些符合大众喜好.业内公认好评."即使你不喜欢,你也会承认它不错"的酒款.而且介绍到的酒款还会有一个共同的特征,就是能让你方便的在网上买到. 大概会分为烈酒,利口 ...

  4. 深入N皇后问题的两个最高效算法的详解 分类: C/C++ 2014-11-08 17:22 117人阅读 评论(0) 收藏

    N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 一. 求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算 ...

  5. OC基础知识总结 分类: ios学习 OC 2015-06-26 17:58 58人阅读 评论(0) 收藏

    //OC: Objective-C, 面向对象的C语言 //OC与C的区别 //1.OC是C的超集, C语言的所有语法都可以在OC中使用 //2.OC是面向对象 //3.OC是一门运行时语言 //4. ...

  6. Adding a WebPart to a SharePoint 2013 Master Page 分类: Sharepoint 2015-07-08 01:03 7人阅读 评论(0) 收藏

    On SharePoint 2013 you can not add the Web Parts to the master page the same way of 2010. Please use ...

  7. hdu 1232, disjoint set, linked list vs. rooted tree, a minor but substantial optimization for path c 分类: hdoj 2015-07-16 17:13 116人阅读 评论(0) 收藏

    three version are provided. disjoint set, linked list version with weighted-union heuristic, rooted ...

  8. jQuery easyUI datagrid 增加求和统计行 分类: JavaScript 2015-01-14 17:46 2178人阅读 评论(0) 收藏

    在datagrid的onLoadSuccess事件增加代码处理. <style type="text/css"> .subtotal { font-weight: bo ...

  9. 利用OpenMP实现埃拉托斯特尼(Eratosthenes)素数筛法并行化 分类: 算法与数据结构 2015-05-09 12:24 157人阅读 评论(0) 收藏

    1.算法简介 1.1筛法起源 筛法是一种简单检定素数的算法.据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274-194年)发明的,又称埃拉托斯特尼筛法(sieve of Eratos ...

随机推荐

  1. form怎样正确post文件

    form在HTML中,是用于收集用户输入的,基本全部浏览器都支持form.给form加入method属性.就能实现将用户在form内控件输入的信息POST到制定地址.或发送GET请求. 写了以下一段代 ...

  2. hdu 3255 Farming(扫描线)

    题目链接:hdu 3255 Farming 题目大意:给定N个矩形,M个植物,然后给定每一个植物的权值pi,pi表示种植物i的土地,单位面积能够收获pi,每一个矩形给定左下角和右上角点的坐标,以及s, ...

  3. Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeException

    使用MapReduce编写的中文分词程序出现了 Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeExcept ...

  4. 云上领跑,快人一步:华为云抢先发布Redis5.0

    12月17日,华为云在DCS2.0的基础上,快人一步,抢先推出了新的Redis 5.0产品,这是一个崭新的突破.目前国内在缓存领域的发展普遍停留在Redis4.0阶段,华为云率先发布了Redis5.0 ...

  5. bzoj3109【CQOI2013】新数独

    3109: [cqoi2013]新数独 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 365  Solved: 229 [Submit][Statu ...

  6. 大话设计模式C++实现-第14章-观察者模式

    一.UML图 关键词:Subject维护一个Observer列表.Subject运行Notify()时就运行列表中的每一个Observer的Update(). 二.概念 观察者模式:定义了一种一对多的 ...

  7. Koa2学习(九)与mongoDB交互

    Koa2学习(九)与mongoDB交互 数据库下载与安装 windows下载地址:http://dl.mongodb.org/dl/win32/x86_64 linux下载地址:https://www ...

  8. JDK安装以及配置环境变量的步骤

    ---恢复内容开始--- 一.JDK安装 JDK下载链接:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads ...

  9. XMU 1056 瞌睡 vs 听课 【动态规划】

    1056: 瞌睡 vs 听课 Time Limit: 500 MS  Memory Limit: 64 MBSubmit: 19  Solved: 6[Submit][Status][Web Boar ...

  10. 高负载linux调优

    调整Linux内核参数: # vi /etc/sysctl.conf# tells the Kernel it's ok if services bind to non-existant IP ADD ...