zoukankan      html  css  js  c++  java
  • 【算法导论C++代码】最大子数组

    #define Inf 65535
    #include <iostream>
    using namespace std;
    void FindMaxCrossingSubarray(int *Array, int low, int mid, int high,
                                 int &maxLeft,int &maxRight, int &sum);
    
    void FindMaxmumSubarry(int *Array,int low,int high,
                           int &relow,int &rehigh,int &resum);
    
    void main()
    {
        int Array[]={13,-3,-25,20,-3,-16,
        -23,18,20,-7,12,-5,-22,15,-4,7};
        cout<<"分治策略,求最大子数组"<<endl;
        int low,high,sum;
        FindMaxmumSubarry(Array,0,15,low,high,sum);
        cout<<"买入天数"<<low<<"卖出天数"<<high<<"总盈利"<<sum<<endl;
        system("pause");
    
    }
    
    void FindMaxCrossingSubarray(int *Array, int low, int mid, int high,
                                 int &maxLeft,int &maxRight, int &sum)
    {
        int leftSum = -Inf;
        sum=0;
        for(int i=mid;i>low;i--)
        {
            sum=sum+Array[i];
            if(sum>leftSum)
            {
                leftSum=sum;
                maxLeft=i;
            }
        }
    
        int rightSum = -Inf;
        sum=0;
        for(int j=mid+1;j<high;j++)
        {
            sum=sum+Array[j];
            if(sum>rightSum)
            {
                rightSum=sum;
                maxRight=j;
            }
        }
    
        sum=leftSum+rightSum;
    }
    void FindMaxmumSubarry(int *Array,int low,int high,
                           int &relow,int &rehigh,int &resum)
    {
        if (high==low)
        {
            relow=low;
            high=rehigh;
            resum=Array[low];
        }
        else
        {
            int mid=(low+high)/2;
            int leftLow,leftHigh,leftSum,
                rightLow,rightHigh,rightSum,
                crossLow,crossHigh,crossSum;
            FindMaxmumSubarry(Array,low,mid,leftLow,leftHigh,leftSum);
            FindMaxmumSubarry(Array,mid+1,high,rightLow,rightHigh,rightSum);
            FindMaxCrossingSubarray(Array,low,mid,high,crossLow,crossHigh,crossSum);
    
            if (leftSum>=rightSum&&leftSum>=crossSum)
            {    
                relow=leftLow;
                rehigh=leftHigh;
                resum=leftSum;
            }
            else if(rightSum>=leftSum&&rightSum>=crossSum)
            {
                relow=rightLow;
                rehigh=rightHigh;
                resum=rightSum;
            }
            else
            {
                relow=crossLow;
                rehigh=crossHigh;
                resum=crossSum;
            }
        }
    }
  • 相关阅读:
    [kafka] 005_kafka_Java_API
    [kafka] 004_kafka_安装运行
    [kafka] 003_kafka_主要配置
    [kafka] 002_kafka_相关术语详细解析
    [kafka] 001_kafka起步
    [随想感悟] 《归去来兮辞·并序》 赏析
    [hadoop] 一些基础概念
    [kylin] 部署kylin服务
    CSAPP 读书笔记
    ubuntu下安装vmTools, 和共享文件
  • 原文地址:https://www.cnblogs.com/fastcam/p/4778367.html
Copyright © 2011-2022 走看看