方法一:采用分治法求解 分为三种状况 将序列递归的二分 而最大值位于三种可能的位置 一是完全位于左边 二是完全位于右边 三是横跨左右代码如下
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=rightBorde

本文介绍了如何使用分治法解决最大子序列和的问题,通过递归将序列二分并考虑三种可能的最大值位置:完全在左边、完全在右边或横跨左右。同时,讨论了数组第一个元素与最大子序列的关系,包括三种情况:元素本身构成最大段、以该元素开始的最大段以及该元素与最大段无关。
最低0.47元/天 解锁文章
1752

被折叠的 条评论
为什么被折叠?



