zoukankan      html  css  js  c++  java
  • 算法笔记--最大子段和问题

    算法笔记

    1.非连续最大子段和

    如果不全为负数,最大子段和所有大于等于0的元素的和;如果全为负数,最大子段和为最大的负数。

    2.连续最大子段和

    ①无长度限制:

    例题:

    洛谷p1115最大子段和

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    int main()
    {
        ios::sync_with_stdio(false);
        int n;
        ll ans=1ll<<63,now=0;
        cin>>n;
        while(n--)
        {
            int a;
            cin>>a;
            now+=a;
            if(now>ans)ans=now;
            if(now<0)now=0;
        }
        cout<<ans<<endl;
        return 0;
    }
    View Code

    HDU 1003 Max Sum

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define pb push_back
    #define mem(a,b) memset(a,b,sizeof(a))
    
    const int INF=0x3f3f3f3f;
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int T,a,n;
        while(cin>>T)
        {
            for(int i=1;i<=T;i++)
            {
    
                cin>>n;
                int l,r,_l=1,mx=-INF,sum=0;
                for(int j=1;j<=n;j++)
                {
                    cin>>a;
                    sum+=a;
                    if(sum>mx)
                    {
                        mx=sum;
                        l=_l;
                        r=j;
                    }
                    if(sum<0)
                    {
                        sum=0;
                        _l=j+1;
                    }
                }
                if(i-1!=0)cout<<endl;
                cout<<"Case "<<i<<":"<<endl;
                cout<<mx<<' '<<l<<' '<<r<<endl;
            }
        }
        return 0;
    }
    View Code

    ②有长度限制(如最大连续奇数字段和)

    杭电集训队排位赛

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+5;
    int a[N];
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            int n;
            cin>>n;
            for(int i=0;i<n;i++)cin>>a[i];
            int sum=a[0],ans=a[0];
            for(int i=1;i<n-1;i+=2)
            {
                sum+=a[i]+a[i+1];
                if(sum<a[i+1])sum=a[i+1];
                ans=max(ans,sum);
            }
            sum=a[1];
            for(int i=2;i<n-1;i+=2)
            {
                sum+=a[i]+a[i+1];
                if(sum<a[i+1])sum=a[i+1];
                ans=max(ans,sum);
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    寒假作业1
    秋季学习总结
    记叙在人生路上对你影响最大的三位老师
    2019年春季学期第二周作业
    币值转换
    第九周作业
    第八周作业
    第七周作业
    第六周作业
    第五周作业
  • 原文地址:https://www.cnblogs.com/widsom/p/7127628.html
Copyright © 2011-2022 走看看