最大连续数列的和
题目
求最大连续子序列的和
Input
第一行输入n(n<=500),第二行为n个以空格分开的整数(-1000到1000之间);
Output
该序列中最大的连续子序列的和
Sample Input
6
1 2 -5 6 7 8
Sample Output
21
解题思路
设f[i]为以序列中第i个元素结尾的最大子序列之和。如果第i个数加上以上个数结尾的最大子序列之和的和大于0,
那么f[i]就接上前面的序列,因为这样会使和比自己本身组成一个序列要大。
否则f[i]为0,因为清0就不会将后面的序列拉小,影响到后面的结果。
f
初
值
为
0
f初值为0
f初值为0
|||||||||||||{
[
0
,
f
[
i
−
1
]
+
a
[
i
]
<
0
[ 0 , f[i-1]+a[i]<0
[0,f[i−1]+a[i]<0
f
[
i
]
=
[
f[i]=[
f[i]=[
|||||||||||||{
[
f
[
i
−
1
]
+
a
[
i
]
,
f
[
i
−
1
]
+
a
[
i
]
>
=
0
[ f[i-1]+a[i] , f[i-1]+a[i]>=0
[f[i−1]+a[i],f[i−1]+a[i]>=0
(
1
<
=
i
<
=
n
)
( 1<=i<=n )
(1<=i<=n)
#include<iostream>
using namespace std;
long long n,a[1001],ans,f[1001];
void in(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
}void dp(){
for(int i=1;i<=n;i++){
if(a[i]+f[i-1]<0){//若是接上前数列不能增值
f[i]=0;//不接,赋值为0,不拖后面的腿
}else{
f[i]=f[i-1]+a[i];//接上前面的数列
}
}for(int i=1;i<=n;i++){
ans=max(ans,f[i]);//找出最大连续数列的和
}
}
int main(){
in();
dp();
cout<<ans;
}