zoukankan      html  css  js  c++  java
  • 最大子序和

    题目描述

    输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大。

    例如 1,-3,5,1,-2,3

    当m=4时,S=5+1-2+3=7
    当m=2或m=3时,S=5+1=6

    输入

    第一行两个数n,m(n,m<=300000)
    第二行有n个数,要求在n个数找到最大子序和

    输出

    一个数,数出他们的最大子序和

    样例输入

    6 4
    1 -3 5 1 -2 3
    

    样例输出

    7
    一道清新宜人的单调队列模板题。。。 
    #include <bits/stdc++.h>
    #define ll long long
    #define met(a) memset(a,0,sizeof(a))
    #define inf 0x3f3f3f3f
    using namespace std;
    const int mod=1e9+7;
    int a[300010],b[300010];
    int main()
    {
        std::ios::sync_with_stdio(false);
        std::cin.tie(0);
        met(a),met(b);
        int i,j,k,m,n;
        int ans=0;
        int l=1,r=1;
        cin>>n>>m;
        for(i=1; i<=n; i++)
        {
            cin>>k;
            a[i]=a[i-1]+k;
        }
        for(i=1; i<=n; i++)
        {
            while(l<=r&&b[l]<i-m)
                l++;
            ans=max(ans,a[i]-a[b[l]]);
            while(l<=r&&a[b[r]]>=a[i])
                r--;
            b[++r]=i;
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    构建之法8,9,10章
    作业6
    通过处理器类型获得处理器对象
    面经
    C语言实现字符串替换
    计算机网络整理
    常见面试题
    数据库常见面试题
    redis常见知识整理
    项目总结
  • 原文地址:https://www.cnblogs.com/nublity/p/9366557.html
Copyright © 2011-2022 走看看