题目描述:

给定一个浮点数序列(可能有正数、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得到最大值即为答案。

代码如下:

  1. #include<stdio.h>
  2. double max(double a,double b){return a>b?a:b;}
  3. double min(double a,double b){return a<b?a:b;}
  4. double dp1[100001];
  5. double dp2[100001];
  6. double data[100001];
  7. double helper(double data[],int n)
  8. {
  9. dp1[0]=data[0];
  10. dp2[0]=data[0];
  11. for(int i=1;i<n;i++)
  12. {
  13. dp1[i]=max(data[i],max(dp1[i-1]*data[i],dp2[i-1]*data[i]));
  14. dp2[i]=min(data[i],min(dp1[i-1]*data[i],dp2[i-1]*data[i]));
  15. }
  16. double ans=dp1[0];
  17. for(int i=1;i<n;i++)
  18. {
  19. ans=max(ans,dp1[i]);
  20. }
  21. return ans;
  22. }
  23.  
  24. int main(void)
  25. {
  26. int i,n;
  27. while(scanf("%d",&n)!=EOF)
  28. {
  29. for(i=0; i<n; ++i)
  30. {
  31. scanf("%lf", &data[i]);
  32. }
  33. double ans = helper(data, n);
  34. printf("%lf\n",ans);
  35. }
  36. return 0;
  37. }

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

  1. double helper(double data[], int n)
  2. {
  3. double ans = data[0];
  4. double localMax = data[0];
  5. double localMin = data[0];
  6. for(int i=1; i<n; ++i)
  7. {
  8. double t1 = max(data[i], max(localMax*data[i], localMin*data[i]) );
  9. double t2 = min(data[i], min(localMax*data[i], localMin*data[i]) );
  10.  
  11. localMax = t1;
  12. localMin = t2;
  13.  
  14. ans = localMax > ans ? localMax : ans;
  15. }
  16.  
  17. return ans;
  18. }

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

动态规划:最大连续子序列乘积 分类: 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. CentOS里route命令详解

    Route 功能简述:linux系统中的route命令能够用于IP路由表的显示和操作.它的主要作用是创建一个静态路由让指定一个主机或者一个网络通过一个网络接口,如eth0.当使用"add&q ...

  2. ZOJ 3316 Game 一般图最大匹配带花树

    一般图最大匹配带花树: 建图后,计算最大匹配数. 假设有一个联通块不是完美匹配,先手就能够走那个没被匹配到的点.后手不论怎么走,都必定走到一个被匹配的点上.先手就能够顺着这个交错路走下去,最后一定是后 ...

  3. 淘宝API学习之道:淘宝TOP之API接口接入教程

    作为一个中小型站点开发人员,淘宝API的开放大大缩短了站点的开发周期和运作效率.面对海量的数据.开发人员仅仅要细致阅读开发文档,熟悉对应的接口,就能够把数据导入自己的站点,这样就不必望洋兴叹了. 眼下 ...

  4. 异或巧用:Single Number

    异或巧用:Single Number 今天刷leetcode,碰到了到题Single Number.认为解答非常巧妙,故记之... 题目: Given an array of integers, ev ...

  5. MYSQL将时间格式化

    SELECT *,DATE_FORMAT(FROM_UNIXTIME(createtime), "%Y/%m/%d %H:%i:%s") AS dateFormat FROM `I ...

  6. STM32的精确延时

    /*---------------------------------------------------------- 文件名:systick.c 文件描写叙述:sysTick 系统滴答时钟1us中 ...

  7. 百度接口通过ip获取用户所在地

    /** * 百度接口      * 通过用户ip获取用户所在地      * @param userIp      * @return      */ public static String get ...

  8. YTU 2979: MathBook类--多态

    2979: MathBook类--多态 时间限制: 1 Sec  内存限制: 128 MB 提交: 51  解决: 31 题目描述 Book类将自己的display函数设计为虚函数,从而通过父类指针调 ...

  9. 一步一步学Silverlight 2系列(1):创建一个基本的Silverlight应用

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  10. android 设置textview中划线效果

    textView.getPaint().setFlags(Paint. UNDERLINE_TEXT_FLAG ); //下划线   textView.getPaint().setAntiAlias( ...