luogu1115 最大子段和

网友投稿 261 2022-09-02

luogu1115 最大子段和

(​​ 题目描述

给出一段序列,选出其中连续且非空的一段使得这段和最大。 输入输出格式

输入格式:

输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度。

第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列。

输出格式:

输入文件maxsum1.out仅包括1个整数,为最大的子段和是多少。子段的最小长度为1。 输入输出样例

输入样例#1: 复制

7 2 -4 3 -1 2 -4 3

输出样例#1: 复制

4

说明

【样例说明】2 -4 3 -1 2 -4 3

【数据规模与约定】

对于40%的数据,有N ≤ 2000。

对于100%的数据,有N ≤ 200000。

设dp[i]表示以i结尾的数列最大子段和是多少

那么显然有一种 简单的策略 那就是如果<0的话我就从0开始 统计这个数的贡献 否则就累加一下

#include#include#include#define N 220000using namespace std; inline char gc(){ static char now[1<<16],*S,*T; if (T==S) {T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;} return *S++;}inline int read(){ int x=0,f=1;char ch=gc(); while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=gc();} while(ch<='9'&&ch>='0') x=x*10+ch-'0',ch=gc(); return x*f;}int n,a[N],dp[N];int main(){ freopen("1115.in","r",stdin); n=read();int ans=-0x3f3f3f3f; for (int i=1;i<=n;++i) a[i]=read(); for (int i=1;i<=n;++i){ if(dp[i-1]+a[i]<0) dp[i]=a[i];else dp[i]=dp[i-1]+a[i];ans=max(ans,dp[i]); }printf("%d",ans); return 0;}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:bzoj3470 Freda’s Walk
下一篇:vijos1111 小胖的水果
相关文章

 发表评论

暂时没有评论,来抢沙发吧~