您的位置:首页 > 其它

最大子序列求解 分治法和动态规划

2012-03-08 17:11 405 查看
方法一:采用分治法求解 分为三种状况 将序列递归的二分 而最大值位于三种可能的位置 一是完全位于左边 二是完全位于右边 三是横跨左右代码如下

int maxSubSum(int *A ,int left,int right)
{
int maxLeftSum=0;
int maxRightSum=0;
int leftBorderSum=0;
int rightBorderSum=0;
int maxLeftBorderSum=0;
int maxRightBorderSum=0;
if(left==right)
return A[left]>0? A[left]:0;
int center=(left+right)/2;
maxLeftSum=maxSubSum(A,left,center);
maxRightSum=maxSubSum(A,center+1,right);

for(int i=center;i>=left;i--)
{
leftBorderSum+=A[i];
if(leftBorderSum>maxLeftBorderSum)
maxLeftBorderSum=leftBorderSum;
}
for(int j=center+1;j<=right;j++)
{
rightBorderSum+=A[j];
if(rightBorderSum>maxRightBorderSum)
maxRightBorderSum=rightBorderSum;
}
return  max( max(maxLeftSum,maxRightSum),maxRightBorderSum+maxLeftBorderSum);

}


方法二 动态规划法

可以考虑数组的第一个元素,以及最大的一段数组(A[i], ..., A[j]),和A[0]的关系,有一下几种情况:

    1. 当0 = i = j 时,元素A[0]本身构成和最大的一段;

    2. 当0 = i < j 时,和最大的一段以A[0]开始;

    3. 当0 < i 时, 元素A[0]和最大的一段没有关系。

int MaxSubString(int* A,int n)
{
int Start = A[0];
int All = A[0];
for(int i = 1; i <n; i++)
{
Start = max( A[i], A[i] + Start);
All = max(Start, All);
}
return All;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: