大佬们,思路是:
- 先求序列的前缀和;
- 前缀和中遍历所有连续不小于零的序列,并求和;
- 求所有序列的最大值;
不知道问题出在哪里?思路应该没错吧
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> sum;
int main(){
int n,ans = 0,len = 0;
scanf("%d",&n);
sum.push_back(0);
for(int i = 1;i <= n;i++){
int tmp;
scanf("%d",&tmp);
ans = max(tmp,ans);
len += tmp;
sum.push_back(len);//存储前缀和
}
int st = 0,end = -1;
bool st_ = false;
for(int i = 1;i <= n;i++){
if(sum[i] >= 0 && st_ == false){//寻找前缀和中不小于零序列中的起始位置
st = i - 1;
st_ = true;
}
if(st_ == true && sum[i] < 0){//序列中的结束位置
int tmp = sum[i - 1] - sum[st];
ans = max(ans,tmp);//比较去最大值
st_ = false;
}
}
cout << ans << endl;
return 0;
}