• [刷题] 最大子列和


    最大子列和问题

    //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

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

  • 相关阅读:
    HDU 5334 Virtual Participation(2015多校第四场)
    HDU 1754 I Hate It(线段树+单点更新)
    HDU 5308 I Wanna Become A 24-Point Master(2015多校第二场)
    linux下socket调试
    linux驱动之hello_world源码与编译
    那些年优秀的HTML5活动页面
    近期Responsive web design项目经验分享-高分辨率图片处理篇
    近期Responsive web design项目经验分享
    var foo= {} ;foo.method() 和 单例模式有什么区别
    Web程序设计
  • 原文地址:https://www.cnblogs.com/cxc1357/p/10610243.html
Copyright © 2020-2023  润新知