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
  • 相关阅读:
    re
    response.xpath
    response.css
    mongovue无法显示collection的问题
    window下安装scrapy
    openCV 图片的处理
    sql server 日期时间操作
    怎样在visual studio 2005 让客户端的recv函数不阻塞
    c# winform 程序用126邮箱发邮件
    MiniDump类笔记
  • 原文地址:https://www.cnblogs.com/widsom/p/7127628.html
Copyright © 2011-2022 走看看