动态规划:最大连续子序列乘积 分类: c/c++ 算法 2014-09-30 17:03 656人阅读 评论(0) 收藏
题目描述:
给定一个浮点数序列(可能有正数、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) 收藏的更多相关文章
- APP被苹果APPStore拒绝的各种原因 分类: ios相关 app相关 2015-06-25 17:27 200人阅读 评论(0) 收藏
APP被苹果APPStore拒绝的各种原因 1.程序有重大bug,程序不能启动,或者中途退出. 2.绕过苹果的付费渠道,我们之前游戏里的用兑换码兑换金币. 3.游戏里有实物奖励的话,一定要说清楚,奖励 ...
- AFNetworing进行POST上传 分类: ios技术 2015-04-01 17:03 73人阅读 评论(0) 收藏
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //申明返回的结果是json类型 m ...
- 转自知乎,亲民好酒推荐 分类: fool_tree的笔记本 2014-11-08 17:37 652人阅读 评论(0) 收藏
这里尽量为大家推荐一些符合大众喜好.业内公认好评."即使你不喜欢,你也会承认它不错"的酒款.而且介绍到的酒款还会有一个共同的特征,就是能让你方便的在网上买到. 大概会分为烈酒,利口 ...
- 深入N皇后问题的两个最高效算法的详解 分类: C/C++ 2014-11-08 17:22 117人阅读 评论(0) 收藏
N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 一. 求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算 ...
- 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. ...
- 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 ...
- 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 ...
- jQuery easyUI datagrid 增加求和统计行 分类: JavaScript 2015-01-14 17:46 2178人阅读 评论(0) 收藏
在datagrid的onLoadSuccess事件增加代码处理. <style type="text/css"> .subtotal { font-weight: bo ...
- 利用OpenMP实现埃拉托斯特尼(Eratosthenes)素数筛法并行化 分类: 算法与数据结构 2015-05-09 12:24 157人阅读 评论(0) 收藏
1.算法简介 1.1筛法起源 筛法是一种简单检定素数的算法.据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274-194年)发明的,又称埃拉托斯特尼筛法(sieve of Eratos ...
随机推荐
- JavaSE入门学习9:Java基础语法之数组
一数组的定义 数组能够理解为是一个巨大的"盒子",里面能够按顺序存放多个类型同样的数据.比方能够定义int型的数组 scores存储4名学生的成绩. watermark/2/tex ...
- 说说Android应用的persistent属性(转)
1 启动persistent应用 在Android系统中,有一种永久性应用.它们对应的AndroidManifest.xml文件里,会将persistent属性设为true,比如: <appli ...
- 纯C语言实现简单封装继承机制
0 继承是OO设计的基础 继承是OO设计中的基本部分,也是实现多态的基础,C++,C#,Objective-C.Java.PHP.JavaScript等为OO而设计的语言,其语言本身对实现继承提供了直 ...
- POST 请求静态文件 响应405
使用post方式请求js.html这样的静态文件一般的web服务器都会返回405 Method Not Allowed. 我测试用的web服务器用的是IIS(windows10+IIS10),理论上来 ...
- 返回零长度的数组或者集合,而不是null
<<Effective Java>> 第四十三条:返回零长度的数组或者集合,而不是null 假设一个方法的返回值类型是集合或者数组 .假设在方法内部须要返回的集合或者数组是零长 ...
- 汉诺塔算法c++源代码(递归与非递归)[转]
算法介绍: 其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n - 1(有兴趣的可以自己证明试试看).后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了.首先把三根柱 ...
- Win7下安装iMac系统
首先是灰常激动啊,一下午的努力最终在自己华硕的笔记本上安装了mac系统. 先上一个成果截图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXl4aGh4/ ...
- 深入分析linux调度机制
一.说明 本文以linux-2.4.10 为例主要分析Linux 进程调度模块中的schedule 函数及其相关的函数.另外相关的前提知识也会说明.默认系统平台是自己的i386 架构的pc. 二.前提 ...
- import-module in $profile
$PROFILE C:\Users\clu\Documents\PowerShell\Microsoft.PowerShell_profile.ps1 Import-Module 'C:\Users\ ...
- Machine Learning Note - Note 1
I am working on the Andrew Ng's course on Machine Learing. I have a question on the week2 session. I ...