• 最大连续子序列和(分治法)


    给n个数,要求n个数的最大连续子序列和。   DP在O(n)的时间内就能求出,很简单。

    但这里用分治的思想去做, 复杂度是O(nlogn),  二分用了O(logn),每次二分内的处理用了O(n)

    将一个序列对半切(mid),那么这个最大连续子序列和要么在[l,mid],要么在[mid+1,r],要么跨越两边。

    那么就要求出[l,mid]的最大连续子序列和, [mid+1,r]的连续子序列和,  跨越两边的连续子序列和

    前两个问题是子问题,可以递归去解决。 所以只要解决第三个问题,然后返回三者中的最大者

    第三个问题,我们可以从中间开始,分别向两边枚举。

    枚举的时间复杂度是O(n),递归的深度是logn, 所以复杂度是O(nlogn)

     1 int fenzhi(int L, int R)
     2 {
     3     if(L==R)
     4         return a[L];
     5     int mid = (L+R)>>1;
     6     int LSum = fenzhi(L,mid);
     7     int RSum = fenzhi(mid+1,R);
     8     int MidSum1 = 0 , MidSum2 = 0,tmp = 0;
     9     for(int i=mid;i>=L; --i)
    10     {
    11         tmp += a[i];
    12         if(tmp>MidSum1)
    13         {
    14             MidSum1 = tmp;
    15         }
    16     }
    17     tmp = 0;
    18     for(int i=mid+1;i<+R;++i)
    19     {
    20         tmp += a[i];
    21         if(tmp>MidSum2)
    22             MidSum2 = tmp;
    23     }
    24     return max(LSum,MidSum1+MidSum2,RSum);
    25 }
  • 相关阅读:
    文化因素对商标翻译的影响
    Building An Effective Marketing Plan
    HipHop PHP简介(转)
    关于comet
    TI BSL in python
    剖析 HTTP 协议
    NSIS 打包脚本基础
    图解使用VS的安装项目打包程序
    [Java IO]06_JSON操作
    [Java IO]04_系统标准IO
  • 原文地址:https://www.cnblogs.com/justPassBy/p/4852514.html
Copyright © 2020-2023  润新知