1589. 最大部分和(连续部分和)
问题描述
有 𝑛 个整数(1≤𝑛≤100),排成一排,例如:𝑛=7
−2 13 12 9 14 −10 2 (7个整数)
其最大的部分和为 48 (即 13+12+9+14)。
输入
第一行一个整数 𝑛;
第二行 𝑛个整数 𝑥𝑖(−100≤𝑥𝑖≤100);
第二行的数之间有一个空格;
输出
一个整数(即最大的连续的部分和)。
样例
输入
7 -2 13 12 9 14 -10 2
输出
48
说明
【来源】
2014江苏省青少年信息学奥林匹克竞赛复赛。
这一道题考察的是动态规划(DP)的基础,用到的是线性化动态规划,DP[i] 来存储以 i 为结尾的最大子段和即可。
点赞+收藏+关注。
代码如下
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int N=1e5+5;
long long a[N],dp[N];
//dp[i]:以i为结尾的最大子段和
int main()
{
long long n,i,maxx=-9e18;
cin >> n;
for(i=1;i<=n;i++)
{
cin >> a[i];
}
for(i=1;i<=n;i++)
{
if(i==1)
dp[i]=a[i]; //边界
else
dp[i]=max(dp[i-1]+a[i],a[i]); //状态转移方程
maxx=max(maxx,dp[i]);
}
cout << maxx;
return 0;
}