• 最大子数组分治方案C++实现


    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang

    以下实现最大子数组的分治策略,算法来自《算法导论》

    #include<iostream>
    using namespace std;
     
    struct ans
    {
        int low;
        int high;
        int sum;
    };
     
    ans MAXIMUM_CROSSING_SBUARRAY(int * A, int low, int mid, int high)
    {
        ans cross_ans = {mid, mid, INT_MIN};
        ans cross_left = {mid, mid, INT_MIN};
        ans cross_right = {mid + 1, mid + 1, INT_MIN};
        int sum = 0;
        for(int i = mid; i >= low; --i)
        {
            sum += A[i];
            if(cross_left.sum < sum)
            {
                cross_left.sum = sum;
                cross_left.low = i;
            }
        }
        sum = 0;
        for (int j = mid + 1; j <= high; ++j)
        {
            sum += A[j];
            if(cross_right.sum < sum)
            {
                cross_right.sum = sum;
                cross_right.high = j;
            }
        }
        cross_ans.low = cross_left.low;
        cross_ans.high = cross_right.high;
        cross_ans.sum = cross_left.sum + cross_right.sum;
        return cross_ans;
    }
     
    ans MAXIMUM_SUBARRAY(int * A, int low, int high)
    {
        if(low == high)
        {
            ans myans = {low, high, A[low]};
            return myans;
        }
        else
        {
            int mid = (low + high) / 2;
            ans leftans = MAXIMUM_SUBARRAY(A, low, mid);
            ans rightans = MAXIMUM_SUBARRAY(A, mid + 1, high);
            ans crossans = MAXIMUM_CROSSING_SBUARRAY(A, low, mid, high);
            if(leftans.sum > rightans.sum && leftans.sum > crossans.sum)
                return leftans;
            else if(rightans.sum > leftans.sum && rightans.sum > crossans.sum)
                return rightans;
            else
                return crossans;
        }
    }
     
    int main()
    {
        int b[] = {3, -2, 5, -7, 3, 1, 1,-4, 9, -3};
        ans mybestans = MAXIMUM_SUBARRAY(b, 0, 9);
        cout << "The sub_array's elements of b with the greatest sum is the element from "<< mybestans.low << " to " << mybestans.high << endl;
        cout << "The sum is " << mybestans.sum << endl;
        return 0;
    }
  • 相关阅读:
    hdu-5569 matrix(dp)
    hdu-5780 gcd(数学)
    hdu-5778 abs(暴力枚举)
    hdu-5777 domino(贪心)
    hdu-5776 sum(同余)
    polymer-quick tour of polymer
    polymer-developer guide-feature overview
    polymer技巧
    polymer入门例子-已过时
    polymer-developer guide-registration and lifecycle
  • 原文地址:https://www.cnblogs.com/xiaoyajiang/p/5950201.html
Copyright © 2020-2023  润新知