[刷题] 最大子列和

最大子列和问题

//O(N^3)
int MaxSubseqSum1(int A[],int N){
    int ThisSum,MaxSum = 0;
    int i,j,k;
    for(i=0;i<N;i++){
        for(j=i;j<N;j++)
            ThisSum = 0;
            for(k=i;k<=j;k++)
                ThisSum += A[k];
            if(ThisSum > MaxSum){
                MaxSum = ThisSum;
        }
    }
    return MaxSum;
}

//O(N^2)
int MaxSubseqSum2(int A[],int N){
    int ThisSum,MaxSum = 0;
    int i,j,k;
    for(i=0;i<N;i++){
        ThisSum = 0;
        for(j=i;j<N;j++)
            ThisSum += A[j];
        if(ThisSum > MaxSum){
            MaxSum = ThisSum;
        }
    }
    return MaxSum;
}

//O(N*logN)——分治 

//O(N)——在线处理 
int MaxSubseqSum4(int A[],int N){
    int ThisSum,MaxSum;
    int i;
    ThisSum = MaxSum = 0;
    for(i = 0;i<N;i++){
        ThisSum += A[i];
        if(ThisSum>MaxSum)
            MaxSum = ThisSum;
        else if(ThisSum<0)
            ThisSum = 0; 
    }
    return MaxSum;
}

 练习题:

#include <stdio.h>
#define MAXN 100000
void MaxSubseqSum(int A[],int N);
int main(){
    int List[MAXN],N,i;
    scanf("%d",&N);
    for (i=0;i<N;i++)
        scanf("%d",&List[i]);
    MaxSubseqSum(List,N);
    return 0;
}

void MaxSubseqSum(int A[],int N){
    int ThisSum,MaxSum;
    int i,start,end,temp;
    ThisSum = MaxSum = 0;
    start = end = temp = 0;
    for(i = 0;i < N;i++){
        ThisSum += A[i];
        if(ThisSum > MaxSum){
            start = temp;
            end = i;
            MaxSum = ThisSum;
        }
        else if(ThisSum < 0){
            temp = i+1;
            ThisSum = 0; 
        }
    }
    if(MaxSum==0) end = N-1;
    printf("%d %d %d",MaxSum,A[start],A[end]);
}

试点5:负数和0未通过

其他测点通过

#include <stdio.h>
#define MAXN 100000
void MaxSubseqSum(int A[],int N);
int main(){
    int List[MAXN],N,i;
    scanf("%d",&N);
    for (i=0;i<N;i++)
        scanf("%d",&List[i]);
    MaxSubseqSum(List,N);
    return 0;
}

void MaxSubseqSum(int A[],int N){
    int ThisSum,MaxSum;
    int i,start,end,temp,flag;
    ThisSum = MaxSum = 0;
    start = end = temp = flag = 0;
    for(i = 0;i < N;i++){
        ThisSum += A[i];
        if(A[i]>=0) flag = 1;
        if(ThisSum > MaxSum){
            start = temp;
            end = i;
            MaxSum = ThisSum;
        }
        else if(ThisSum < 0){
            temp = i+1;
            ThisSum = 0; 
        }
    }
    if(MaxSum==0){
        if(flag == 0){
            printf("0 %d %d",A[0],A[N-1]);
        }
        else{
            printf("0 0 0");
        }
    }
    else{
        printf("%d %d %d",MaxSum,A[start],A[end]);
    }
}

全部测点通过

这里有个坑,如果全为负数,输出第一个和最后一个元素,如果中间有个0,就要都输出0

还有一个坑就是要输出元素而不是元素下标,题目给的例子元素和下标正好相等,估计会坑不少人 

原文地址:https://www.cnblogs.com/cxc1357/p/10610243.html