求最大连续子序列,一开始我是直接三重循环算的。。但是最后一个样例超时。
所以,我们可以改进:
记前n项和为Sn,那么,连续的i-j的子序列之和为:S[j] - S[i-1]
所以,不用三重循环,用二重循环就算出连续子序列的和了。
在代码里,用了sum来使用二重循环计算序列和。
这是三重循环的超时写法:
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
sum += a[j];
if(a[i]<0) continue;
for(int p=i;p<=j;p++)
sum+=a[p];
正确姿势在这里:
//1007
int a[10005];
int main(){
int n,maxx,l=0,r=0,sum;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",a+i);
}
maxx = a[0];
for(int i=0;i<n;i++){
sum = 0;
for(int j=i;j<n;j++){
sum += a[j];
if(a[i]<0) continue;
if(sum>maxx)
{
maxx = sum;
l = i;
r = j;
}else if(sum==maxx)
{
if(i<l) {l = i;r = j;}
else if(i==l){if(j<r) {l = i;r = j;}}
}
}
}
bool negative = true;
for(int i=0;i<n;i++) {if(a[i]>=0) negative = false;}
if(!negative) printf("%d %d %d\n",maxx,a[l],a[r]);
else printf("0 %d %d\n",a[0],a[n-1]);
}
return 0;
}