思路:
1.用一个变量max_s
记录最大的字串和,初始为-1001
;
2.我们需要发现一个规律,和最大的子串的前n
(0<n≤len
)一定是正数,否则砍去这个前n
项我们能得到一个和更大的子串,除非这个子串只由一个负数组成;
3.使用一个变量ans
记录当前子串的和,如果ans>max_s
则更新max_s
和最大串的左右端点;如果ans<0
则抛弃当前子串,即更新ans
为0
;
代码:
#include<iostream>
using namespace std;
const int MAX_N=1e5+99;
int arr[MAX_N];
int main(){
int t,kase=0;
cin>>t;
while(t--){
cout<<"Case "<<(++kase)<<":\n";
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>arr[i];
int bg=1,lf,rt,max_s=-1001,ans=0;
for(int i=1;i<=n;i++){
ans+=arr[i];
if(ans>max_s){
max_s=ans;
lf=bg;
rt=i;
}
if(ans<0){
ans=0;
bg=i+1;
}
}
cout<<max_s<<' '<<lf<<' '<<rt<<'\n';
if(t) puts("");
}
return 0;
}