思路:这题看到100000个数据,想暴力破解就基本是不可能的了(暴力时间复杂度是n^2)
换思路,在加上一个数据之后有以下情况:
1.变成负子序列,直接舍去(原因是如果是负子序列之后的任何数据加上它都会变小)
2.变成正子序列,跟之前最大的子序列的和比较
2.1如果小于不用管
2.2如果大于更新最大和,并记录下下标
这个思路的时间复杂度是n;
代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int t;
int c=0;
cin>>t;
while(t--)
{
int s[100010];
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>s[i];
int Start;
int End;
int sum;
int max_sum=-1001;
int ts,te;
ts=te=0;
End=Start=sum=0;
while(End<n)
{
sum+=s[End];
if(sum>max_sum)//如果子串比之前的最大子串还要大,那么记录子串的初始和末位置
{
max_sum=sum;
ts=Start;
te=End;
}
if(sum<0)//舍去负子串
{
sum=0;
Start=End+1;
}
End++;
}
c++;
cout<<"Case "<<c<<":"<<endl;
cout<<max_sum<<" "<<ts+1<<" "<<te+1<<endl;
if(t)
cout<<endl;
}
return 0;
}