您的位置:首页 > 其它

最大子列问题几种方法

2016-02-29 15:14 323 查看
int MaxSubseqSum1(int List[], int N)
{
int ThisSum,MaxSum = 0;
for (int i = 0; i < N; i++)
{
for (int j = i; j < N; j++)
{
ThisSum = 0;
for (int k = i; k <=j; k++)
ThisSum += List[k];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}

int MaxSubseqSum2(int List[], int N)
{
int ThisSum,MaxSum = 0;
for (int i = 0; i < N; i++)
{
ThisSum = 0;
for (int j = i; j < N; j++)
{
ThisSum += List[j];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}

//在线处理
int MaxSubseqSum3(int List[], int N)
{
int ThisSum = 0;
int MaxSum = 0;

for (int i = 0; i < N; i++)
{
ThisSum += List[i];//向右累加
if (ThisSum > MaxSum)
MaxSum = ThisSum;//发现更大的则更新当前的结果
else if (ThisSum < 0)//如果当前的子列和为负,则不可能使后面的部分和增大,抛弃之
ThisSum = 0;
}

return MaxSum;
}

//分而治之
int Max3(int A, int B, int C)
{
int Max = A;
if (Max < B) Max = B;
if (Max < C) Max = C;
return Max;
}

int DivideAndConquer(int List[], int left, int right)
{
if (left == right)//递归终止的条件,子列只有一个数字
{
if (List[left] > 0)
return List[left];
return 0;
}

int center = (left + right)/2;//找到中分的点
//递归求得两边子列的最大和
int MaxLeftSum = DivideAndConquer(List, left, center);
int MaxRightSum = DivideAndConquer(List, center+1, right);

//下面求跨分解线的最大子列和
int MaxLeftBorderSum = 0;
int LeftBorderSum = 0;

for (int i = center; i >= left; i--)
{
LeftBorderSum += List[i];
if (LeftBorderSum > MaxLeftBorderSum)
MaxLeftBorderSum = LeftBorderSum;
}//左边扫描结束

int MaxRightBorderSum = 0;
int RightBorderSum = 0;

for (int i = center + 1; i <= right; i++)
{
RightBorderSum += List[i];
if (RightBorderSum > MaxRightBorderSum)
MaxRightBorderSum = RightBorderSum;
}//右边扫描结束

return Max3(MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum);
}

int MaxSubseqSum4(int List[], int N)
{
return DivideAndConquer(List, 0, N-1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: