您的位置:首页 > 其它

分治算法求最长子序列和

2015-12-04 13:16 246 查看
    把数组分成两部分 ,则最长子序列可能出现在中线左边的数组,右边的数组或者一部分在左边、一部分在右边。而左边、右边数组的最长子序列又可依前法求解,这样可以用递归实现程序。

#include <iostream>
#include <algorithm>
using namespace std;
int max3(int a, int b, int c)
{
return max(max(a, b), c);
}
int MaxSubSum(int *a, int left, int right)
{
int maxLeftSum = 0, maxRightSum = 0;
int leftBorderSum = 0, rightBorderSum=0;
int maxLeftBorderSum = 0, maxRightBorderSum = 0;
if (left == right)
return a[left] > 0 ? a[left] : 0;
int mid = (left + right) / 2;
maxLeftSum = MaxSubSum(a, left, mid);
maxRightSum = MaxSubSum(a, mid + 1, right);
for (int i = mid; i >= left; --i)
{
leftBorderSum += a[i];
if (leftBorderSum > maxLeftBorderSum)
maxLeftBorderSum = leftBorderSum;
}
for (int i = mid + 1; i <= right; ++i)
{
rightBorderSum += a[i];
if (rightBorderSum > maxRightBorderSum)
maxRightBorderSum = rightBorderSum;
}
int maxBorderSum = maxRightBorderSum + maxLeftBorderSum;
return max3(maxLeftSum, maxRightSum, maxBorderSum);
}
int MaxSubSequenceSum(int *a, int n)
{
return MaxSubSum(a,0,n - 1);
}

int main()
{
int a[]{ 4, -3, 5, -2, -1, 2, 6, -2 };
cout << MaxSubSequenceSum(a, 8);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  分治算法