传送门
给定有n个整数(可能为负整数)组成的序列a1,a2,…,an,求该序列连续的子段和的最大值。
如果该序列的所有元素都是负整数时定义其最大子段和为0。例如,当(a1,a2,a3,a4,a5)=(-5,11,-4,13,-4-2)时,最大子段和为11+(-4)+13=20。
Input
第一行整数个数N 第二行为N个整数,每个整数之间用一空格隔开。 1<=N<=100000 N个整数的范围为-1000到1000
Output
一行一个数,表示最大连续子段和的值
思路:
判断当前所选的a[i]与dp[i-1]的大小,如果dp[i-1] +a[i] < a[i],则可以得出当前所选的a[i]若是加入到前一个序列当中,会使序列总值减小,因而序列的连续就要在此了断!
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[100010];
ll dp[100010];
int main()
{
int n;
cin>>n;
for(int i = 1; i <= n; i++)
{
cin>>a[i];
}
ll ans = -1000;
for(int i = 1; i <= n; i++)
{
dp[i] = max(a[i],dp[i-1]+a[i]);
ans = max(ans,dp[i]);
}
cout<<ans<<endl;
}