最大连续数列的和
题目
求最大连续子序列的和
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就不会将后面的序列拉小,影响到后面的结果。
|||||||||||||{
|||||||||||||{
#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;
}