最大连续区间和问题

2017-08-27 16:38:47

writer:pprp

最大连续区间和,可以有很多种方法实现,其中最常见的是运用一维前缀和还有动态规划来解决的;

代码如下:

/*
@theme:最大连续区间和的算法
@writer:pprp
@declare:有几种方法
@date:2017/8/27
*/

#include <bits/stdc++.h>

using namespace std;
const int maxn = 10000;
int a[maxn];
int sum[maxn];
int ans;

int main()
{
    //法一、暴力解,这就不写了
    //法二、采用一维前缀和

    ios::sync_with_stdio(false);
    int N;
    cin >> N;
    for(int i = 0 ; i < N ; i++)
    {
        cin >> a[i];
    }
    sum[0] = a[0];
    for(int i = 1 ; i < N ; i++)
        sum[i] = sum[i-1] + a[i];

    ans = 0;
    for(int i = 0 ; i < N ; i++)
        for(int j = i+1 ; j < N ; j++)
            ans = max(ans,sum[j]-sum[i-1]);

            cout << ans << endl;
    //法三、动态规划
    int ans = 0;
    int tmp = 0;
    for(int i = 0 ; i < N ; i++)
    {
          tmp = max(tmp,0) + a[i];
          ans = max(ans, tmp);
    }

    cout << ans << endl;
    //总结,一般都采用的是第三种方法,比较省时间和空间
    return 0;
}
时间: 2024-10-17 06:36:09

最大连续区间和问题的相关文章

51Nod - 1094 和为k的连续区间

51Nod - 1094 和为k的连续区间 一整数数列a1, a2, ... , an(有正有负),以及另一个整数k,求一个区间[i, j],(1 <= i <= j <= n),使得a[i] + ... + a[j] = k. Input 第1行:2个数N,K.N为数列的长度.K为需要求的和.(2 <= N <= 10000,-10^9 <= K <= 10^9) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9). Ou

最大连续区间和的算法总结(转)

最大连续区间和是一个经典的问题.给定一个长度为n的序列a[1],a[2]...a[n-1],a[n],求一个连续的子序列a[i],a[i+1]...a[j-1],a[j],使得a[i]+a[i+1]...a[j-1]+a[j]最大. ①最简单最容易想到的就是根据定义来枚举.枚举上下界{i,j | 0<=i<=j<=n},维护一个max值即可.其中枚举上下界的时间复杂度为O(n^2),求区间和的复杂度为O(n),所以总时间复杂度为O(n^3). for ( int i = 1 ; i &l

解题报告:hdu1003 Max Sum - 最大连续区间和 - 计算开头和结尾

2017-09-06 21:32:22 writer:pprp 可以作为一个模板 /* @theme: hdu1003 Max Sum @writer:pprp @end:21:26 @declare:连续区间最大和 @data:2017/9/6 */ #include <bits/stdc++.h> using namespace std; int main() { //freopen("in.txt","r",stdin); int cas; cin

51Nod 1810 连续区间

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1810 题目给出一个1~n的排列,问有多少连续区间.连续区间的定义为区间内元素排序后之间间隔为1. 对于一个区间[l,r],令mid=(l+r)/2,我们如果能在O(n)内求解出左端点在[l,mid],右端点在[mid+1,r]的连续区间数量,就可以将问题一分为二,递归求解[l,mid] [mid+1,r]. 现在来求解上面所说的这个子问题,首先默认i<j,有一个结论m

[ACM] HDU 5086 Revenge of Segment Tree(全部连续区间的和)

Revenge of Segment Tree Problem Description In computer science, a segment tree is a tree data structure for storing intervals, or segments. It allows querying which of the stored segments contain a given point. It is, in principle, a static structur

连续区间最值问题

1. 已知一个一维数组nums,求nums的一个连续区间,使其和最大.返回最大和.(O(n)) hdu1005 2. 已知一个一维数组nums,求nums的一个最长连续区间,使其和为k.返回最大区间长度.(O(n)) 3. 已知一个一维数组nums,求nums的一个连续区间,使其和是不超过k的最大值.返回不超过k的最大和.(O(nlogn)) LeetCode363

最大连续区间和的算法总结

最大连续区间和是一个经典的问题.给定一个长度为n的序列a[1],a[2]...a[n-1],a[n],求一个连续的子序列a[i],a[i+1]...a[j-1],a[j],使得a[i]+a[i+1]...a[j-1]+a[j]最大. ①最简单最容易想到的就是根据定义来枚举.枚举上下界{i,j | 0<=i<=j<=n},维护一个max值即可.其中枚举上下界的时间复杂度为O(n^2),求区间和的复杂度为O(n),所以总时间复杂度为O(n^3). (  i = 1 ; i <= n ;

[ACM] HDU 5086 Revenge of Segment Tree(所有连续区间的和)

Revenge of Segment Tree Problem Description In computer science, a segment tree is a tree data structure for storing intervals, or segments. It allows querying which of the stored segments contain a given point. It is, in principle, a static structur

怎样用取尺法处理连续区间内数字同样

常常会遇到类似以下这样的问题: 给你n个数.由0和1组成,问1或者0的最大连续长度是多少 110001101的最大连续长度就是中间3个连续的0.所以是3 这里略微总结出了一个取尺法,以后遇到这种题目就不须要再思考太多细节了 int L, R = 1, ans = 0; for(L = 1; L <= n; L = R + 1) { for(R = L; R + 1 <= n && B[L] == B[R + 1]; R++); ans = max(ans, R - L + 1)