最大子序和

最大子序和

http://www.nowcoder.com/questionTerminal/3d0919b699fc4567ab3435b19929aace

https://ac.nowcoder.com/acm/contest/1006/D
【题目】
输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大。
例如 1,-3,5,1,-2,3
当m=4时,S=5+1-2+3=7
当m=2或m=3时,S=5+1=6
输入:
第一行两个数n,m(n,m≤300000)
第二行有n个数,要求在n个数找到最大子序和
输出:一个数,数出他们的最大子序和

思路:有些人用的单调队列写的,我在这介绍一下我的想法。直接暴力加贪心,首先枚举一段连续子序列的起点,
利用贪心求出从起点连续的最大和,注意地方直接看代码;反之break;因为你每次需要的序列必然是连续的,当不符合时,可以再枚举起点的时候进行操作,不必重复操作。

#define first f
#define second s
#define ll long long
#define mp make_pair
#define pb push_back
#include<bits/stdc++.h>
#define pii pair<ll,ll>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=3e5+5;

int a[maxn];

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    ll sum=0,mx=-1e17;
    for(int i=1;i<=n;i++){
        sum=0;
        for(int j=i,k=0;k<m&&j+k<=n;k++){
            if(sum+a[j+k]>=a[j+k]){
                sum+=a[j+k];
                mx=max(mx,sum);
            }
            else{sum=a[j+k];mx=max(mx,sum);}
        }
    }
    cout<<mx<<endl;
    return 0;
}
全部评论

相关推荐

我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务