题目来源:小米手机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 ;
}
 

最大连续子序列乘积(DP)的更多相关文章

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

    题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 分析:若暴力求解,需要O(n^3)时间,太低效,故使用动态规划. 设data[i]:第i个数据,dp[i]:以第 ...

  2. HDU 1231 最大连续子序列 --- 入门DP

    HDU 1231 题目大意以及解题思路见: HDU 1003题解,此题和HDU 1003只是记录的信息不同,处理完全相同. /* HDU 1231 最大连续子序列 --- 入门DP */ #inclu ...

  3. 九度OJ 1501 最大连续子序列乘积 -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1501 题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 输入: 输入可能包含 ...

  4. HDU 1231——最大连续子序列(DP)

    最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  5. 最大连续子序列(DP)

    Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j < ...

  6. HDU 1231:最大连续子序列(DP)

    pid=1231">最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  7. HDU 1231 最大连续子序列 (dp)

    题目链接 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ...,  Nj },其中 1 <= ...

  8. 九度OJ 1011:最大连续子序列 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5615 解决:2668 题目描述:     给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, N ...

  9. 最长连续子序列(dp,分而治之递归)

    5227: 最大子列和问题 时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte 总提交: 76            测试通过:46 描述 给定KK个整数组 ...

随机推荐

  1. node-schedule定时任务

    https://github.com/node-schedule/node-schedule npm install node-schedule * * * * * * ┬ ┬ ┬ ┬ ┬ ┬ │ │ ...

  2. Swing学习笔记1-----Swing组件类的层次

    1.  从结构上划分 Swing 组件类分为两种,一种是JComponent类,一种是Windows类.其中windows类包含的是一些可以独立显示的组件,而JComponent类包含的是不可以独立显 ...

  3. Cannot create file "C:\Users\Administrator\AppData\Local\Temp\EditorLineEnds.ttr"

    这个问题的产生根据网上搜集的资料是因为微软的新补丁KB2970228和KB2982791限制了字体文件的使用机制, 而EditorLineEnds.ttr是delphi字体临时文件, 这就导致了del ...

  4. Android使用Application的好处

    如果一个应用程序有2个入口的,1个入口程序打开修改其中的内容,怎么实现另一个入口的数据也修改呢? 下面就用到Application来实现数据的共享,因为一个应用程序只有一个Application,Ap ...

  5. 判断是否为mac电脑 、还是windows操作系统

    /** * 是否为mac系统(包含iphone手机) * */ var isMac = function() { return /macintosh|mac os x/i.test(navigator ...

  6. SQL——行值表达式(Row Value Expressions)

    概述 最近接触了一个新概念——行值表达式,也叫做行值构造器.这是一个很强大的SQL功能,通常我们所操作的SQL表达式都只能针对一行中的单一字段进行操作比较,而行值表达式可以针对一行中的多个字段进行操作 ...

  7. 验证码类库CaptchaMvc

    CaptchaMvc是一个有弹性的.简单的解决方案,它能够解决你项目中所有与验证码相关的问题.你需要做的所有事情就是向你的项目中添加一个类库,添加之后验证码就准备就绪了.该项目拥有使用验证码所需要的所 ...

  8. Lesson 5 No wrong numbers

    Text Mr.James Scott has a garage in Silbury and now he has just bought another garage in Pinhurst. P ...

  9. Python黑帽编程 3.2 ARP监控

    Python黑帽编程 3.2 ARP监控 在第3.1节<ARP欺骗>中,我们学习了ARP的基本原理,使用Python实现了我们自己的ARP欺骗工具.在上一节的基础上,我们来实现一个ARP监 ...

  10. 【整理】待毕业.Net码农就业求职储备

    声明:本文题目来源于互联网,仅供即将从学校毕业的.Net码农(当然,我本人也是菜逼一个)学习之用.当然,学习了这些题目不一定会拿到offer,但是针对就业求职做些针对性的准备也是不错的.此外,除了技术 ...