《github一天一道算法题》:分治法求数组最大连续子序列和

原创 2014年11月05日 21:29:34

看书、思考、写代码!

/***************************************
 * copyright@hustyangju 
 * blog: http://blog.csdn.net/hustyangju 
 * 题目:分治法求数组最大连续子序列和
 * 思路:分解成子问题+合并答案
 * 时间复杂度:O(n lgn)
 * 空间复杂度:O(1) 
***************************************/
#include <iostream>

using namespace std;

template<class type>
class max_subarray
{
public:
    max_subarray(type *p):_p(p){}
    ~max_subarray(){}
    type max_aside_subarray(int s,int e);
protected:
    type max_cross_subarray(int s,int m,int e);
    type _max(type a,type b,type c);
private:
    type *_p;
};

template<class type>
type max_subarray<type>::_max(type a, type b, type c)
{
    if((a>=b)&&(a>=c))
        return a;
    else if((b>=a)&&(b>=c))
        return b;
    else
        return c;
}

template<class type>
type max_subarray<type>::max_cross_subarray(int s, int m, int e)
{
    type left_sum=*(_p+m);
    type right_sum=*(_p+m+1);
    for(int i=m;i>=s;i--)
    {
        type sum=0;
        sum+=*(_p+i);
        if(sum>left_sum)
            left_sum=sum;
    }//for
    for(int i=m+1;i<=e;i++)
    {
        type sum=0;
        sum+=*(_p+i);
        if(sum>right_sum)
            right_sum=sum;
    }//for
    return(left_sum+right_sum);
}

template<class type>
type max_subarray<type>::max_aside_subarray(int s, int e)
{
    int m=0;
    type left_sum,right_sum,cross_sum;
    if(s==e)
        return(*(_p+s));
    else
        m=int((s+e)/2);
    left_sum=max_aside_subarray(s,m);
    cross_sum=max_cross_subarray(s,m,e);
    right_sum=max_aside_subarray(m+1,e);
    return _max(left_sum,cross_sum,right_sum);
}

int main()
{
            int array1[10]={1,-2,-3,4,5,6,-7,-8,9,10};
           // float array2[10]={1.0,-2.0,-3.0,4.0,5.2,6.0,-7.0,-8.0,9.0,-10.0};
            max_subarray<int> mysubarray1(array1);
            //max_subarray<float>mysubarray2(array2);
            cout<<"max sum of sub array is: ";
            cout<<mysubarray1.max_aside_subarray(0,9)<<endl;
           // cout<<"max sum of sub array is: ";
            //cout<<mysubarray2.max_aside_subarray(0,9)<<endl;
}




hdu 1003 Max Sum(最大连续子序列和) (学了一下分治)

都不知道以前刷杭电是怎么做的最大连续子序列和,
  • u012659423
  • u012659423
  • 2014年07月17日 13:03
  • 1168

求一个整型数组中的最大连续子序列和

求一个整型数组中的最大连续子序列和,例如数组(3,2,-1,4,-3)中和最大的连续子序列为(2,-1,4),其和为5。 Java代码如下: public class Main { public...
  • csulfy
  • csulfy
  • 2016年10月17日 23:36
  • 549

分治法——最大子数组

题目描述: 给定一个n个元素的数组a,求a[i]+a[i+1]+…+a[j]的最大值(0
  • fuyukai
  • fuyukai
  • 2015年03月10日 20:38
  • 927

[算法入门经典] 8.1.3 分治法 求最大连续和

这个问题看了好久,
  • x_iaow_ei
  • x_iaow_ei
  • 2014年06月05日 16:52
  • 977

分治法求最大连续子数组

算法导论第四章学习
  • myfather103
  • myfather103
  • 2017年12月27日 19:39
  • 28

最大连续子序列算法(数组的连续子数组最大和(首尾不相连))

相关描述: 连续子序列最大和,其实就是求一个序列中连续的子序列中元素和最大的那个。 比如例如给定序列: { -5,-2, 11, -4, 13, -5, -8 } 其最大连续子序列为{ 11, -...
  • Z_zhangyinqian
  • Z_zhangyinqian
  • 2015年08月30日 16:10
  • 1025

C++ 关于最大连续子序列(和最大)问题

/* 江伟浚 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total...
  • MadBam_boo
  • MadBam_boo
  • 2016年03月12日 22:10
  • 354

数组连续子序列的最大的和-四种算法,四种时间复杂度

给定一组数据:31, -41, 59, 26, -53, 58, 97, -93, -23, 84。要求找到这组数据中连和最大的子序列,相信很多人都看过这个算法,能够直接给出线性时间复杂度的解法。但是...
  • zzran
  • zzran
  • 2012年12月25日 22:05
  • 3819

分治法之求最大连续子序列和

对原问题有如下解 1.最大子序列在数组中点的左边 2.最大子序列在数组中点的右边 3.最大子序列跨越数组中点#include using namespace std; int FIND_MAX_...
  • aNoobCoder
  • aNoobCoder
  • 2017年03月05日 11:52
  • 329

六种姿势拿下连续子序列最大和问题,附伪代码(以HDU 1003 1231为例)

问题描述:       连续子序列最大和,其实就是求一个序列中连续的子序列中元素和最大的那个。       比如例如给定序列:            { -2, 11, -4, 13, -5, -2...
  • hcbbt
  • hcbbt
  • 2013年08月28日 21:13
  • 16908
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《github一天一道算法题》:分治法求数组最大连续子序列和
举报原因:
原因补充:

(最多只允许输入30个字)