题目来源:小米手机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. Mac OS X 中快速访问系统根目录的四种方法

    1.通过终端打开Finder的根目录          open / 2.通过“前往文件夹”快捷键组合 用户只需点击左上角的“前往”菜单,然后选择“前往文件夹...”功能.使用快捷键+Shift+G也 ...

  2. 通读SDWebImage①--总体梳理、下载和缓存

    本文目录 下载操作SDWebImageDownloaderOptions和下载过程实现 下载管理SDWebImageDownloader 缓存SDImageCache SDWebImageManage ...

  3. python基础之day2

    python基本数据类型 1.数字 int(整型)      在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647  在64位系统 ...

  4. [原创]MySQL RR隔离级别下begin或start transaction开启事务后的可重复读?

    Server version:         5.6.21-log MySQL Community Server (GPL) 前提提要: 我们知道MySQL的RR(repeatable read)隔 ...

  5. vim插件之tabular,代码对齐强迫症必备

    本周整理一批别人写的代码,要处理好所有的注释和缩进. 碰到那种大片的赋值或者注释或者宏定义,但又没对齐的,简直太难看了. 于是手工对了几个,觉得确实不是人干的活,心想这种需求应该有工具自动搞定才对啊, ...

  6. 流行的JavaScript库 ——jQuery

    1.为了简化 JavaScript 的开发, 一些 JavsScript 库诞生了. JavaScript 库封装了很多预定义的对象和实用函数.能帮助使用者建立有高难度交互的 Web2.0 特性的富客 ...

  7. 拒绝了对对象 'base_config' (数据库 '****',架构 'dbo')的 SELECT 权限

    在网上看了很多资料都是空说一谈,都只是说很简单,然后没有说遇到这样的情况具体该怎么做,看到这里都知道是权限问题,其实我们每一个人都知道,又是我觉得我还是要给以后遇到的朋友个解决方法:  这里用到的数据 ...

  8. HTML+CSS中的一些小知识

    今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...

  9. AFNetWorking

    目录: 1.为什么要用AFNetworking 2.AFNetworking的用法 一.为什么要用AFNetworking 在ios开发中,一般情况下,简单的向某个web站点简单的页面提交请求并获取服 ...

  10. Lesson 13 The Greenwood Boys

    Text The Greenwood Boys are group of pop singers. At present, they are visiting all parts of the cou ...