zoukankan      html  css  js  c++  java
  • 分治法:最大连续和

    解决这个问题,采用前缀和平扫的时间复杂度为O(n^2),本文分治法的时间复杂度为O(n*log*(n))

    前缀和平扫首先对n个数做前缀和,接下来利用前缀和枚举每一个区间即可

    分治法的代码实现如下:

     1 #include<iostream>
     2 #include<algorithm>
     3 using namespace std;
     4 const int maxn=20000005;
     5 const int INF=0x7fffffff;
     6 long long a[maxn];
     7 int n;
     8 long long maxsum(long long* A,int x,int y)
     9 {
    10     long long v,L,R,maxs=-INF;
    11     if(y-x==1)
    12         return A[x];
    13     int m=x+(y-x)/2;
    14     maxs=max(maxsum(A,x,m),maxsum(A,m,y));
    15     v=0;
    16     L=A[m-1];
    17     for(int i=m-1;i>=x;i--)
    18         L=max(L,v+=A[i]);
    19     v=0;
    20     R=A[m];
    21     for(int i=m;i<y;i++)
    22         R=max(R,v+=A[i]);
    23     return max(maxs,L+R);
    24 }
    25 int main()
    26 {
    27     cin>>n;
    28     if(n!=0)
    29     {
    30         for(int i=1;i<=n;i++)
    31         {
    32             cin>>a[i];
    33         }
    34         cout<<maxsum(a,1,n+1)<<endl;
    35     }
    36     return 0;
    37 }

    具体实现原理将在后续补充。

  • 相关阅读:
    同余 扩展欧几里得
    185. [USACO Oct08] 挖水井
    Dijkstra算法
    Floyed算法
    codves——1079 回家
    codves——1021 玛丽卡
    codves——5960 信使
    计算几何基础
    【正睿oi省选十连测】第一场
    [APIO2012]守卫
  • 原文地址:https://www.cnblogs.com/aininot260/p/9305904.html
Copyright © 2011-2022 走看看