• 51nod 1049 最大子段和


    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
     收藏
     关注
    N个整数组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续子段和的最大值。当所给的整数均为负数时和为0。
     
    例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。
    Input
    第1行:整数序列的长度N(2 <= N <= 50000)
    第2 - N + 1行:N个整数(-10^9 <= A[i] <= 10^9)
    Output
    输出最大子段和。
    Input示例
    6
    -2
    11
    -4
    13
    -5
    -2
    Output示例
    20


    预处理:前缀和
    last:上一个正数的位置
    dp[i]表示这个子段最后一个是i的最大和
    状态转移:
    如果前一个是非负数,dp[i]=dp[i-1]+a[i]
    否则,dp[i]=max(a[i],dp[last]+sum[i]-dp[last])
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n;
    long long a[50001],dp[50001],sum[50001];
    int main()
    {
        scanf("%d",&n);
        int last=0;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];
        for(int i=1;i<=n;i++)
        {
            if(a[i-1]>=0) dp[i]=dp[i-1]+a[i],last=i;
            else dp[i]=max(a[i],dp[last]+sum[i]-sum[last]);
        }
        long long ans=0;
        for(int i=1;i<=n;i++) ans=max(ans,dp[i]);
        printf("%lld",ans);
    }
  • 相关阅读:
    this指向问题
    b继承a的函数
    如何解决跨域问题
    事件冒泡和阻止事件冒泡
    Spring5(二)——IOC
    MySQL基础(四)——
    MySQL基础(二)——常用命令
    MySQL基础(一)——入门
    Linux(二)——常用命令
    Linux(一)——简介
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6625173.html
Copyright © 2020-2023  润新知