(转)经典优化算法之分治法(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; } };

浙公网安备 33010602011771号