zoukankan      html  css  js  c++  java
  • 最大连续子序列和(分治法)

    给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 }
  • 相关阅读:
    贪心——poj百炼3468:电池寿命
    贪心——部分背包
    C++编程规范
    调和级数求和
    人工神经网络
    Latex各种符号
    poj1088 滑雪,dp
    数据挖掘建模过程
    Java MyEclipse:The type java.lang.CharSequence cannot be resolved. It is indirectly referen
    Java调用阿里云短信接口发送手机验证码
  • 原文地址:https://www.cnblogs.com/justPassBy/p/4852514.html
Copyright © 2011-2022 走看看