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;
            }
        }
    }
  • 相关阅读:
    国外pip源下载太慢,修改成国内pip源
    i++和i--
    CSS3之太极图源代码
    对 Vue 的理解(一)
    CSS 盒子模型及 float 和 position
    Notes about Vue Style Guide
    TypeScript 入门笔记
    flex 布局
    git rebase 和 git merge 总结
    理解JavaScript作用域
  • 原文地址:https://www.cnblogs.com/fastcam/p/4778367.html
Copyright © 2011-2022 走看看