hdu4561 bjfu1270 最大子段积

就是最大子段和的变体。最大子段和只要一个数组,记录前i个里的最大子段和在f[i]里就行了,但是最大子段积因为有负乘负得正这一点,所以还需要把前i个里的最小子段积存起来。就可以了。直接上代码:

/*
 * Author    : ben
 */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <functional>
#include <numeric>
#include <cctype>
using namespace std;
//输入非负整数,用法int a = get_int();
int get_int() {
    int res = 0, ch;
    while (!((ch = getchar()) >= ‘0‘ && ch <= ‘9‘)) {
        if (ch == EOF)
            return -1;
    }
    res = ch - ‘0‘;
    while ((ch = getchar()) >= ‘0‘ && ch <= ‘9‘)
        res = res * 10 + (ch - ‘0‘);
    return res;
}
//输入整数(包括负整数,故不能通过返回值判断是否输入到EOF,本函数当输入到EOF时,返回-1),用法int a = get_int2();
int get_int2() {
    int res = 0, ch, flag = 0;
    while (!((ch = getchar()) >= ‘0‘ && ch <= ‘9‘)) {
        if (ch == ‘-‘)
            flag = 1;
        if (ch == EOF)
            return -1;
    }
    res = ch - ‘0‘;
    while ((ch = getchar()) >= ‘0‘ && ch <= ‘9‘)
        res = res * 10 + (ch - ‘0‘);
    if (flag == 1)
        res = -res;
    return res;
}

const int MAXN = 10009;
int maxr[MAXN], minr[MAXN];

inline int mymul(int a, int b) {
    int sign = 1;
    if (a * b == 0) {
        return 0;
    }
    if (a * b < 0) {
        sign = -1;
    }
    return sign * (abs(a) + abs(b));
}

int main() {
    int T = get_int(), tmp, N;
    int a[3];
    for (int t = 1; t <= T; t++) {
        N = get_int();
        maxr[0] = minr[0] = 0;
        int ans = 0;
        for (int i = 1; i <= N; i++) {
            tmp = get_int2() / 2;
            a[0] = mymul(maxr[i - 1], tmp);
            a[1] = mymul(minr[i - 1], tmp);
            a[2] = tmp;
            sort(a, a + 3);
            maxr[i] = a[2];
            ans = maxr[i] > ans ? maxr[i] : ans;
            minr[i] = a[0];
        }
        printf("Case #%d: %d\n", t, ans);
    }
    return 0;
}
时间: 2024-12-27 17:32:26

hdu4561 bjfu1270 最大子段积的相关文章

leecode 每日解题思路 152 Maximun Product Subarray

问题描述: 问题链接:152 Maximum Product Subarray 在经典的算法解析中, 有关的分治和动态规划的,经典题型之一就是求最大子段和, 这道题就是他的变形:求最大子段积; 这个问题的核心思路与解决最大子段和相同, 但是唯一需要注意的就是负数的情况. 每次在比较当前最大结果的同时,也需要保存当前最小结果,所以每个当前点i处的取值, 就是从当前值nums[i], 和cur_max+nums[i], cur_min+nums[i]三者中取极值: 每次的取值递推路径如上所示, 应该

leetcode152

这个题的题意是求出一个数组中的最大连续子段积,一下就能想到最大连续子段和,那么也是通过计算出以a[i]结尾的最大连续子段积,然后每次更新来求出最大值. 设dp[i],以a[i]结尾的最大连续子段积. 注意数组中存在负数,当处理负数时,如果dp[i-1]能够表示以i-1结尾的最小负数,这两者相乘就是以a[i]结尾的最大积了.因此想到应该同时维护两个dp数组,分别是以a[i]结尾的最大正数,和以a[i]为结尾的最小负数. 明白了这一点,接下来要考虑的就是初始化的问题,只需要初始化位置0即可,当a[0

hdu-4561 连续最大积( 水题)

http://acm.hdu.edu.cn/showproblem.php?pid=4561 求连续最大积. 他妈的狗逼思路到底咋说..... 思路是 %&*()*(&……))*)*&)……%……%**(*()()——+(**(……&*……%&*……Y%^&%%^*&&(&*(&*(*&()*&(**……&%……& %&……%&……&(&……* ())&(

边权之积最小的路径

题目背景 狗哥做烂了最短路,突然机智的考了Bosh一道,没想到把Bosh考住了...你能帮Bosh解决吗? 他会给你100000000000000000000000000000000000%10金币w 题目描述 给定n个点的带权有向图,求从1到n的路径中边权之积最小的简单路径. 输入输出格式 输入格式: 第一行读入两个整数n,m,表示共n个点m条边. 接下来m行,每行三个正整数x,y,z,表示点x到点y有一条边权为z的边. 输出格式: 输出仅包括一行,记为所求路径的边权之积,由于答案可能很大,因

点积与叉乘的运算与物理意义

原文:http://blog.csdn.net/jacke121/article/details/55804353 向量是由n个实数组成的一个n行1列(n*1)或一个1行n列(1*n)的有序数组: 向量的点乘,也叫向量的内积.数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量. 点乘公式 对于向量a和向量b:                        a和b的点积公式为: 要求一维向量a和向量b的行列数相同. 点乘几何意义 点乘的几何意义是可以

最大子段和及其拓展

1.最大子段和问题 问题定义:对于给定序列a1,a2,a3--an,寻找它的某个连续子段,使得其和最大(如果某子序列全是负数则定义该子段和为 0).如( -2,11,-4,13,-5,-2 )最大子段是{ 11,-4,13 }其和为20. ·状态设计: dp[i] (1 <= i <= N) 表示以 a[i] 结尾的最大连续子段和. 显然,dp[i] >= 0 (1 <= i <= N) 状态转移方程:dp[i] = max{dp[i-1] + a[i], 0} (2 <

浅谈一类积性函数的前缀和(转载)

本文转自:http://blog.csdn.net/skywalkert/article/details/50500009 另外,莫比乌斯反演和杜教筛其他可转到 http://blog.leanote.com/post/totziens/%E8%8E%AB%E6%AF%94%E4%B9%8C%E6%96%AF%E5%8F%8D%E6%BC%94 写在前面 笔者在刷题过程中遇到一些求积性函数前缀和的问题,其中有一类问题需要在低于线性时间复杂度的算法,今天就来浅析一下这类问题的求解方法,当作以后讲课

求两个大整数相乘的积,数字长度在127个字符之内。

计算两个大整数相乘的结果,数字不是double类型能表示的,数字长度没有限制(最大127位). 方法一:使用java中的大整数处理库函数,java.math.BigInteger,java.math.BigDecimal; 方法二:不利用库函数,自己实现其功能,可以练习自己对待复杂问题的处理能力,提高编程水平. 此代码中利于两者的结合,利于库函数可以看自己编写的代码的正确性. 1.主函数 import java.math.BigDecimal; import java.util.Scanner;

最大子段和(分治法)

#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <map> #define N 1000005 using namespace std; int a[1005]; int calc(int s,int e,int &l,int &r) { int l1,l2,l3,r1,r2,r3; if(s==e) re