题目:
N个整数组成的序列a11,a22,a33,…,ann, 求该序列如aii+ai+1i+1+…+ajj的连续子段和的最大值。当所给的整数均为负数时和为0。
例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。
Input
第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N + 1行:N个整数(-10^9 <= Aii <= 10^9)
Output
输出最大子段和。
Sample Input
6 -2 11 -4 13 -5 -2
Sample Output
20
解题思路:dp水题,就是寻找最大子序列和,解题关键就是保证前一节点的序列和为正,才能满足子序列和加上当前这位的数值的时候,比当前数值要大。
ac代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 100005
using namespace std;
typedef long long ll;
int num[maxn];
ll dp[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
}
memset(dp,0,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++)
{
if(dp[i-1]>0)
dp[i]=dp[i-1]+num[i];
else
dp[i]=num[i];
}
ll maxx=-maxn;
for(int i=1;i<=n;i++)
{
maxx=max(maxx,dp[i]);
}
printf("%lld\n",maxx);
return 0;
}