题目描述
最大子段和问题。给定由n个整数组成的序列,求序列中子段的最大和,若所有整数均为负整数时定义最大子段和为0。
输入格式
第一行输入整数个数n(1≤n≤1000),再依次输入n个整数。
输出格式
输出最大子段和。
输入样例
5
-2 11 -4 13 -5 -2
输出样例
20
AC代码
#include <iostream>
using namespace std;
typedef long long ll;
const ll maxn = 10500;
ll a[maxn] = {
0},b[maxn] = {
0};
ll ans = -1000005;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
if(i == 1){
b[i] = a[i];
}
else{
b[i] = max(b[i-1]+a[i],a[i]);
}
ans = max(ans,b[i]);
}
cout<<ans;
return 0;
}
解释
〇最大子段和问题在之前我所发的博文中两次提及,但今天又遇到了这个问题,由于是参考了之前的博文才解出本题,故再发一篇博文当作巩固。
①a[maxn] = {0},b[maxn] = {0};
a数组用来存储输入的元素,b数组用来记录局部最大子段和。
②核心:
for(int i=1;i<=n;i++){
if(i == 1){
//如果是第一个元素,那么它本身就是局部最大子段和
b[i] = a[i];
}
else{
//否则,如果前面的子段和加上当前元素对局部最大子段和没有贡献,那么最大子段和
//为当前元素本身。(举个例子,之前的子段和为负数,显然加上它对最大子段和无贡献)
b[i] = max(b[i-1]+a[i],a[i]);
}
ans = max(ans,b[i]);//记录最大子段和
}
③完美的AC。