最大连续子序列乘积(DP)
- 题目来源:小米手机2013年校园招聘笔试题
- 题目描述:
-
给定一个浮点数序列(可能有正数、0和负数),求出一个最大的连续子序列乘积。
- 输入:
-
输入可能包含多个测试样例。
每个测试样例的第一行仅包含正整数 n(n<=100000),表示浮点数序列的个数。
第二行输入n个浮点数用空格分隔。
输入数据保证所有数字乘积在双精度浮点数表示的范围内。
- 输出:
-
对应每个测试案例,输出序列中最大的连续子序列乘积,若乘积为浮点数请保留2位小数,如果最大乘积为负数,输出-1。
- 样例输入:
-
7
-2.5 4 0 3 0.5 8 -1
5
-3.2 5 -1.6 1 2.5
5
-1.1 2.2 -1.1 3.3 -1.1
- 样例输出:
-
12
64
8.78 思路:
这道题目和最大连续子字段和是类似的,也是用dp,只是对于每个数(假设该数是第i个数),我们要存放两个状态,一个是前i个数中包含第i个数的连续子段乘积的最大正数,一个是前i个数中包含第i个数的连续子段乘积的最小负数。假设data[i]存放第i个数,ans[i][0]和ans[i][1]分别存放连续子段乘积的最大正数和最小负数。
状态转移具体可以分情况讨论:- 当i = 1时
如果data[i] >= 0,则ans[1][0] = data[1], ans[1][1] = FMAX (FMAX = -0.001, 表示最大负数)
如果data[i] < 0,则ans[1][0] = ZMIN, ans[1][1] = data[1] (ZMIN = 0.001, 表示最小正数) - 当1 < i <= n 时
(1)情况一:如果data[i] >= 0 - 如果ans[i - 1][0] == ZMIN 或者 data[i] * ans[i - 1][0] <= data[i]
ans[i][0] = data[i] - 如果data[i] * ans[i - 1][0] > data[i]
ans[i][0] = data[i] * ans[i - 1][0] - 如果ans[i - 1][1] == FMAX
ans[i][1] = FMAX - 如果ans[i - 1][1] > FMAX
ans[i][1] = ans[i - 1][1] * data[i]
(2)情况二:如果data[i] < 0
- 如果ans[i - 1][0] == ZMIN 或者 data[i] * ans[i - 1][0] <= data[i]
ans[i][1] = data[i] - 如果data[i] * ans[i - 1][0] > data[i]
ans[i][1] = data[i] * ans[i - 1][0] - 如果ans[i - 1][1] == FMAX
ans[i][0] = ZMIN - 如果ans[i - 1][1] > FMAX
ans[i][0] = ans[i - 1][1] * data[i]
这道题需要注意的是浮点数为0的判断,悲剧自己在这上面wa了好几次!!!看来自己对浮点数的理解还是比较模糊!!
// 1501.cpp : 定义控制台应用程序的入口点。
// #include <stdio.h>
#include <math.h> int n;
double data[ + ];
double ans[ + ][];
double max; #define JD 0.0000001 #define FMAX -0.001
#define ZMIN 0.001 int flag; int main(void)
{
int i; // freopen("in.txt", "r", stdin);
while (scanf("%d", &n) != EOF)
{
flag = ;
for (i = ; i <= n; i ++)
{
scanf("%lf", &data[i]);
if (fabs(data[i]) < JD)
flag = ;
}
if (data[] >= )
{
ans[][] = data[];
ans[][] = FMAX;
}
else
{
ans[][] = ZMIN;
ans[][] = data[];
}
for (i = ; i <= n; i ++)
if (data[i] >= )
{
if (fabs(ans[i - ][] - ZMIN) < JD || data[i] * ans[i - ][] < data[i])
ans[i][] = data[i];
else
ans[i][] = data[i] * ans[i - ][];
if (fabs(ans[i - ][] - FMAX) < JD)
ans[i][] = FMAX;
else
ans[i][] = ans[i - ][] * data[i];
}
else
{
if (fabs(ans[i - ][] - ZMIN) < JD || data[i] * ans[i - ][] > data[i])
ans[i][] = data[i];
else
ans[i][] = data[i] * ans[i - ][];
if (fabs(ans[i - ][] - FMAX) < JD)
ans[i][] = ZMIN;
else
ans[i][] = ans[i - ][] * data[i];
}
max = ans[][];
for (i = ; i <= n; i ++)
if (ans[i][] > max)
max = ans[i][];
if (max > ZMIN)
{
if (fabs(max - (int)max) <= JD)
printf("%d\n", (int)max);
else
printf("%.2f\n", max);
}
else if (fabs(max) <= ZMIN && flag)
printf("0\n");
else
printf("-1\n");
}
return ;
} - 当i = 1时
最大连续子序列乘积(DP)的更多相关文章
- 动态规划:最大连续子序列乘积 分类: c/c++ 算法 2014-09-30 17:03 656人阅读 评论(0) 收藏
题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 分析:若暴力求解,需要O(n^3)时间,太低效,故使用动态规划. 设data[i]:第i个数据,dp[i]:以第 ...
- HDU 1231 最大连续子序列 --- 入门DP
HDU 1231 题目大意以及解题思路见: HDU 1003题解,此题和HDU 1003只是记录的信息不同,处理完全相同. /* HDU 1231 最大连续子序列 --- 入门DP */ #inclu ...
- 九度OJ 1501 最大连续子序列乘积 -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1501 题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 输入: 输入可能包含 ...
- HDU 1231——最大连续子序列(DP)
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- 最大连续子序列(DP)
Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j < ...
- HDU 1231:最大连续子序列(DP)
pid=1231">最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- HDU 1231 最大连续子序列 (dp)
题目链接 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= ...
- 九度OJ 1011:最大连续子序列 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5615 解决:2668 题目描述: 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, N ...
- 最长连续子序列(dp,分而治之递归)
5227: 最大子列和问题 时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte 总提交: 76 测试通过:46 描述 给定KK个整数组 ...
随机推荐
- Golang之chan/goroutine(转)
原文地址:http://tchen.me/posts/2014-01-27-golang-chatroom.html?utm_source=tuicool&utm_medium=referra ...
- MongoDB aggregate 运用篇
基础知识 操作符介绍: $project:包含.排除.重命名和显示字段 $match:查询,需要同find()一样的参数 $limit:限制结果数量 $skip:忽略结果的数量 $sort:按照给定的 ...
- 配置python环境变量(转)
默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1.首先需要在系统中注册python环境变量:假设python的安装路 ...
- Smart3D系列教程1之《浅谈无人机倾斜摄影建模的原理与方法》
一.引言 倾斜摄影测量技术是国际测绘遥感领域近年发展起来的一项高新技术,以大范围.高精度.高清晰的方式全面感知复杂场景,通过高效的数据采集设备及专业的数据处理流程生成的数据成果直观反映地物的外观.位置 ...
- SQl SGA 整理
--查看诊断位置信息 select * from v$diag_info; --查看sga中内存分配信息 select * from sys.x$ksmfs; --查看内存块还剩余多少 select ...
- asp.net 生成图形验证码(字母和数字混合)
验证码技术是网站开发过程中比较重要的技术,可以防止非法人员利用注册机或者登陆工具来攻击我们的网站.下面是效果图: 具体实现方法如下: 1.主要思路是:引用Using System.Drawing命名空 ...
- etcd:用于服务发现的键值存储系统
etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现.etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理 ...
- [搜索引擎]Sphinx的介绍和原理探索
What/Sphinx是什么 定义 Sphinx是一个全文检索引擎. 特性 索引和性能优异 易于集成SQL和XML数据源,并可使用SphinxAPI.SphinxQL或者SphinxSE搜索接口 易于 ...
- java中文乱码解决之道(八)-----解决URL中文乱码问题
我们主要通过两种形式提交向服务器发送请求:URL.表单.而表单形式一般都不会出现乱码问题,乱码问题主要是在URL上面.通过前面几篇博客的介绍我们知道URL向服务器发送请求编码过程实在是实在太混乱了.不 ...
- 从零3D基础入门XNA 4.0(2)——模型和BasicEffect
[题外话] 上一篇文章介绍了3D开发基础与XNA开发程序的整体结构,以及使用Model类的Draw方法将模型绘制到屏幕上.本文接着上一篇文章继续,介绍XNA中模型的结构.BasicEffect的使用以 ...