题记:dp问题,f[i]表示以a[i]为结尾的最大区间和。
在算f[i]时有两种情况
当f[i-1]<0,f[i]等于a[i](这时的左端点为i),否则f[i]等于f[i-1]+a[i]。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N],f[N];
int main(){
int t,sum=1;
cin>>t;
while(t--){
int n;
cin>>n;
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++) cin>>a[i];
int ans=a[1],l=1,r=1,s=1;
f[0]=0;
for(int i=1;i<=n;i++){
f[i]=max(a[i],f[i-1]+a[i]);
if(f[i-1]<0) s=i;
if(f[i]>ans){
l=s;
r=i;
ans=f[i];
}
}
printf("Case %d:\n",sum++);
cout<<ans<<' '<<l<<' '<<r<<endl;
if(t) cout<<endl;
}
return 0;
}