最大子序和
最大子序和
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; }