(转)经典优化算法之分治法(Divide-and-Conquer Algorithm)

经典优化算法之分治法(Divide-and-Conquer Algorithm)

leetcode最大子序和分治法解法class Solution{public:

struct Status
    {
        int lSum, rSum, mSum, iSum;
    };
    Status pushUp(Status l, Status r)
    {
        int iSum = l.iSum + r.iSum;
        int lSum = max(l.lSum, l.iSum + r.lSum);
        int rSum = max(r.rSum, r.iSum + l.rSum);
        int mSum = max(max(l.mSum, r.mSum), l.rSum + r.lSum);
        Status b = { lSum,rSum,mSum,iSum };
        return b;

    }
    Status get(vector<int> &a, int l, int r)
    {
        if (l == r)
        {
            Status b = { a[l],a[l],a[l],a[l] };
            return b;
        }
        int m = (l + r) >> 1;
     //这里结合转载文章中的归并排序动图以及https://www.cnblogs.com/xc90/articles/13811151.html理解
     //关于这里的递归可以自顶向下去思考,结合动图,比如数组大小为8,则需分成左右各4个分别求解,先求左边4个的解后,再求右边4个的解,
     //至于左边4个的解怎么求,当然还是递归的方式,当满足终止条件时递归回升,既然可以通过左4和右4求出8的解,那左4和右4的解
     //当然也容易分别求出,不必深究程序执行步骤。
Status lSub
= get(a, l, m); Status rSub = get(a, m + 1, r); return pushUp(lSub, rSub); } int maxSubArray(vector<int>& nums) { return get(nums, 0, nums.size() - 1).mSum; } };

 

posted @ 2020-10-12 23:33  AI_ON  阅读(199)  评论(0)    收藏  举报