zoukankan      html  css  js  c++  java
  • 最大子列和的四种方法,时间复杂度递减,直至为线性复杂度

    三个for循环,时间复杂度为N的立方。

    下面是我跟着老师的思路打的代码,

    #include<stdio.h>
    int f(int a[],int n) {
        int i,j,k;
        int res=0;;
        for(i=0; i<n; i++) {    //i是开始位置
            for(j=i; j<n; j++) {    //j是结束位置
                int max=0;
                for(k=i; k<=j; k++) {
                    max+=a[k];
                }
    //            printf("max=%d
     res=%d",max,res);
                if(max>=res) {
                    res=max;
                }
            }
    
        }
        return res; 
    }
    
    int main() {
        printf("hello
    ");
        int a[]= {1,2,3,4,5} ;
        int n=5;
        int s=f(a,n);
        printf("s=%d",s);
        return 0;
    }

    改进后的

    #include<stdio.h>
    int f(int a[],int n){
        int i,j;
        int ThisSum=0,MaxSum=0;
        for(int i=0;i<n;i++){    //i是子列左端的位置 
                ThisSum=0;        //ThisSum是子列的和 
            for(int j=i;j<n;j++){    //j是子列右端的位置 
                    ThisSum+=a[j];
                    if(ThisSum>MaxSum){
                        MaxSum=ThisSum;
                    }
            }
        }
        
        return MaxSum;
    }
    
    int main(){
        //数组和大小自己手动更改 
        int a[]={1,2,3,-4,0,5};
        int n=6;
        int res=f(a,n);
        printf("res=%d",res);
        
        return 0;
    }

    这下时间复杂度是N的平方。

    老师前面也讲过,时间复杂度为n的平方,本能的应该想把它降为nlogn

    下面的分治算法就可以做到

    大题思想是把它看成三个部分,左边、右边、中间,也就是分、分、治。

    代码还需要去找找,找到了自己熟悉了再贴出来

    下面的算法就是最简单的了,老师说的它的名字叫在线处理

    下面是代码。

    hello world!
  • 相关阅读:
    BZOJ1087=Codevs2451=洛谷P1896&P2326互不侵犯
    poj1286
    P1066 2^k进制数
    开车旅行
    洛谷P1396 营救
    poj1840
    poj3693
    poj1195
    3955 最长严格上升子序列(加强版)
    1021 玛丽卡
  • 原文地址:https://www.cnblogs.com/simongreen/p/12177214.html
Copyright © 2011-2022 走看看