算法笔记--最大子段和问题

算法笔记

1.非连续最大子段和

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

2.连续最大子段和

①无长度限制:

例题:

洛谷p1115最大子段和

思路:dp[i] = max(a[i], dp[i-1]+a[i])

代码:

#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

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

杭电集训队排位赛

思路:dp[i] = max(a[i], dp[i-2]+a[i-1]+a[i])

代码:

#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

 

posted @ 2017-07-06 17:44  Wisdom+.+  阅读(430)  评论(0编辑  收藏  举报