求最大連續子序列,一開始我是直接三重循環算的。。但是最後一個樣例超時。
所以,我們可以改進:
記前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;
}