http://acm.hdu.edu.cn/showproblem.php?pid=1003
题意:给一串数,求最大子段和,并且记录最靠前的子段的起点和终点。
套公式就可以啦。=w=
#include <iostream>
using namespace std;
#define N 100005
int a[N],f[N],b[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("1003in.txt","r",stdin);
#endif
int t,i,n,end,max,begin,ce=0;
scanf("%d",&t);
while (t--){
ce++;
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%d",&a[i]);
f[0]=a[0];
b[0]=0;
max=f[0];
end=begin=0;
for (i=1;i<n;i++){
if (f[i-1]>=0){ //这个加个等于是很有必要的。
f[i]=f[i-1]+a[i];
b[i]=b[i-1];
}
else{
f[i]=a[i];
b[i]=i;
}
if ((f[i]>max)||(f[i]==max&&b[i]<begin)){
max=f[i];
begin=b[i];
end=i;
}
}
if (ce!=1)
putchar(10);
printf("Case %d:\n%d %d %d\n",ce,max,begin+1,end+1);
}
return 0;
}