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

    最大子序列和

    题目描述

    输入一个长度为n的整数序列(A1,A2,…,An),从中找出一段连续的长度不超过M的子序列,使得这个子序列的和最大。例如:
    序列1,-3,5,l,-2,3,
    当M = 2或3时,S = 5 + 1 = 6;当M = 4时,S = 5 + 1 +(-2)+ 3 = 7。

    输入

      第1行一个整数n表示序列的长度。第2行n个整数,代表序列的元素。第3行一个整数表示M。
      

    输出

      一个整数,即子序列的最大和。保证结果不超过longint范围。
      

    样例输入

    6
    1 -3 5 1 -2 3
    3
    

    样例输出

    6
    

    提示

    50%的数据:N,M≤1000;
    100%的数据:N,M≤20000。

    分析:dp[i]表示以i结尾长度不超过m连续子串最大和,s[i]表示以i结尾的前缀和;

       dp[i]=max(dp[i],s[i]-s[i-j])(1<=j<=m)

       s[i-j](1<=j<=m)要取一个最小值,既然学了线段树,正好拿来试试;

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <cstring>
    #include <string>
    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <list>
    #include <bitset>
    #define rep(i,m,n) for(i=m;i<=n;i++)
    #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
    #define vi vector<int>
    #define pii pair<int,int>
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ll long long
    #define pi acos(-1.0)
    const int maxn=1e6+10;
    const int dis[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
    using namespace std;
    ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
    ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
    int n,m,a[maxn];
    ll sum[maxn],ma;
    void update(int p,int q)
    {
        p+=n-1;
        a[p]=q;
        while(p)
        {
            p=(p-1)/2;
            a[p]=min(a[2*p+1],a[2*p+2]);
        }
    }
    int query(int ql,int qr,int p,int l,int r)
    {
        if(r<=ql||qr<=l)return inf;
        else if(ql<=l&&r<=qr)return a[p];
        else return min(query(ql,qr,p*2+1,l,(l+r)/2),query(ql,qr,p*2+2,(l+r)/2,r));
    }
    int main()
    {
        int i,j,k,t;
        scanf("%d",&t);
        memset(a,inf,sizeof(a));
        n=1;
        while(n<t)n<<=1;
        rep(i,0,t-1)
        {
            scanf("%d",&j);
            if(i)sum[i]=sum[i-1]+j;
            else sum[i]=j;
            update(i,sum[i]);
        }
        scanf("%d",&m);
        ma=sum[0];
        rep(i,1,t-1)
        {
            ma=max(ma,sum[i]-query(max(i-m,0),i,0,0,n));
        }
        rep(i,0,min(m-1,n-1))ma=max(ma,sum[i]);
        printf("%lld
    ",ma);
        //system ("pause");
        return 0;
    }
  • 相关阅读:
    Android SDK 默认位置
    Android点击按钮后改变颜色
    Android设置字体样式
    Android清除缓存的实现
    AndroidStudio Gradle下载速度慢解决方法
    ERROR: SSL peer shut down incorrectly错误解决(Android Studio)
    Android两个页面跳转过程时传递值
    android报错android.view.ViewRootImpl$CalledFromWrongThreadException【本文转载】
    去除searchView的黑框去除
    Caused by: java.lang.IllegalStateException: System services not available to Activities before onCreate()
  • 原文地址:https://www.cnblogs.com/dyzll/p/5743085.html
Copyright © 2011-2022 走看看