洛谷P1115 最大子段和
题目描述
给出一个长度为 n n n 的序列 a a a,选出其中连续且非空的一段使得这段和最大。
输入格式
第一行是一个整数,表示序列的长度 n n n。
第二行有
n
n
n 个整数,第
i
i
i 个整数表示序列的第
i
i
i 个数字
a
i
a_i
ai
i。
输出格式
输出一行一个整数表示答案。
输入输出样例
输入
7
2 -4 3 -1 2 -4 3
输出
4
题目分析
一道线性DP的模板题,定义数组 f f f, f i f_i fi代表以第 i i i 个数结尾的所有兹子段和中的最大值,根据题意易知若子段和长度大于1,则 f i − 1 f_{i-1} fi−1 必然存在于子段和中,因此只要对是否加入第 i − 1 i-1 i−1 个数进行决策即可。故易得状态转移方程 f i = m a x ( a i , f i − 1 + a i ) f_i=max(a_i,f_{i-1}+a_i) fi=max(ai,fi−1+ai)。
Code
#include<iostream>
#include<cstdio>
using namespace std;
const int N=2e5+10;
int n,ans=-0x3f3f3f3f,a[N],f[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
f[i]=max(a[i],f[i-1]+a[i]);
ans=max(ans,f[i]);
}
printf("%d",ans);
return 0;
}
以上就是《洛谷P1115 最大子段和》的详细题解,如果您认为我的文章对您起到了帮助作用,恳请点赞关注支持一下,您的鼓励就是我前进的最大动力。
我是Horseman:一名正在成长的蒟蒻OIer,洛谷题解系列持续更新中,感谢大家的鼓励支持。