C++ HNUCM-OJ 最大字段和相关问题 【模板归纳】+(求出最大子段和,以及子段的起始位置和结束位置 )+(时间复杂度O( n))

题目来源:HNUCM-OJ

HNUCM-OJ 1458:最大字段和
在这里插入图片描述


最大字段和模板

#include
using namespace std;
const int maxn=100+5;
int dp[maxn];
int a[maxn];
int n;
void solve(){
    dp[0]=a[0];
    int maxsum=dp[0];
    for(int j=1;j<n;j++){
        dp[j]=max(dp[j-1]+a[j],a[j]);
        maxsum=max(maxsum,dp[j]);
    }
    cout<<maxsum<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    while(cin>>n){
        for(int i=0;i<n;i++)
            cin>>a[i];
        solve();
    }
    return 0;
}


HNUCM-OJ 1464: Max Sum

在这里插入图片描述


求出最大子段和,以及子段的起始位置和结束位置

#include
#include
using namespace std;
const int maxn=100000+8,INF=0x3f3f3f3f;
int a[maxn],dp[maxn];
int k=1,t,n;
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        int ss=0,en=0;
        int x=0,y=0;
        dp[0]=a[0];
        int maxsum=dp[0];
        for(int i=1;i<n;i++)
        {
            if(dp[i-1]>=0)
            {
                dp[i]=dp[i-1]+a[i];
                en=i;
            }
            else
            {
                dp[i]=a[i];
                ss=en=i;
            }
            maxsum=max(maxsum,dp[i]);
            x=ss+1;
            y=en;
        }
        cout<<"Case "<<k++<<":"<<endl;
        cout<<maxsum<<" "<<x<<" "<<y<<endl;

    }

    return 0;
}

学如逆水行舟,不进则退

你可能感兴趣的:(ACM2019暑期集训,模板归纳,算法详细)