求最大子序列,暴力的话是两重循环,一重让每个数都当开头,一重来控制它的长度。下面这个代码只用了一重循环,但是用到了三个标记变量,first用来标记目前找到的最大子序列的开头,secon用来标记目前找到的最大子序列的结尾。至于t,t用来控制移动first,这句话你细品,代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,x,sum,maxn=-1,first,second,t;
int main()
{
cin>>n;
vector<int>list(n);
for(int i=0;i<n;i++) cin>>list[i];
for(int i=0;i<n;i++)
{
sum+=list[i];
if(sum>maxn)
{
first=t;
second=i;
maxn=sum;
}
else if(sum<0)
{
sum=0;
t=i+1;
}
}
if(maxn==-1) cout<<0<<" "<<list[0]<<" "<<list[n-1]<<endl;
else cout<<maxn<<" "<<list[first]<<" "<<list[second]<<endl;
}