最大子段和(洛谷 p1115)
思路
只需要从后往前扫描,sum累加(同时更新答案),当sum小于0时抛弃后面一段.
注意: 当数据全为负数时,ans的初始值应为数据中最小的一个.
代码
#include <bits/stdc++.h>
using namespace std;
int n,a[200005],sum,ans;
int main(){
scanf("%d",&n);
for (int i=1;i<=n;++i)
scanf("%d",&a[i]),ans=min(ans,a[i]);
for (int i=n;i>=1;i--){
sum+=a[i];
ans=max(ans,sum);
if (sum<0){
sum=0;
}
}
printf("%d",ans);
return 0;
}
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。
本文链接:https://hs-blog.axell.top/archives/29/