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;
            }
        }
    }
  • 相关阅读:
    hdu 1455 N个短木棒 拼成长度相等的几根长木棒 (DFS)
    hdu 1181 以b开头m结尾的咒语 (DFS)
    hdu 1258 从n个数中找和为t的组合 (DFS)
    hdu 4707 仓鼠 记录深度 (BFS)
    LightOJ 1140 How Many Zeroes? (数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3652 B-number (数位DP)
    HDU 5900 QSC and Master (区间DP)
    HDU 5901 Count primes (模板题)
    CodeForces 712C Memory and De-Evolution (贪心+暴力)
  • 原文地址:https://www.cnblogs.com/fastcam/p/4778367.html
Copyright © 2011-2022 走看看