C++ 长度至少为L的最大连续子序列和(递归) int-maxSumRec(常量向量&a,int-left,int-right) { if(left==right)//基本情况 返回一个[左]; int center=(左+右)/2; int maxLeftSum=maxSumRec(a,左,中); int maxRightSum=maxSumRec(a,中间+1,右); int maxLeftBorderSum=0,leftBorderSum=0; 对于(int i=中心;i>=左;i--) { leftBorderSum+=a[i]; 如果(leftBorderSum>maxLeftBorderSum) maxLeftBorderSum=leftBorderSum; } int maxRightBorderSum=0,rightBorderSum=0; 对于(int j=中心+1;j maxRightBorderSum) maxRightBorderSum=rightBorderSum; } 返回max3(maxLeftSum,maxRightSum, maxLeftBorderSum+maxRightBorderSum); }

C++ 长度至少为L的最大连续子序列和(递归) int-maxSumRec(常量向量&a,int-left,int-right) { if(left==right)//基本情况 返回一个[左]; int center=(左+右)/2; int maxLeftSum=maxSumRec(a,左,中); int maxRightSum=maxSumRec(a,中间+1,右); int maxLeftBorderSum=0,leftBorderSum=0; 对于(int i=中心;i>=左;i--) { leftBorderSum+=a[i]; 如果(leftBorderSum>maxLeftBorderSum) maxLeftBorderSum=leftBorderSum; } int maxRightBorderSum=0,rightBorderSum=0; 对于(int j=中心+1;j maxRightBorderSum) maxRightBorderSum=rightBorderSum; } 返回max3(maxLeftSum,maxRightSum, maxLeftBorderSum+maxRightBorderSum); },c++,algorithm,recursion,C++,Algorithm,Recursion,此函数将返回向量的最大连续子序列。任务是实现一个名为“L”的最小序列参数,然后返回长度至少为L的最大连续子序列 示例:不带L参数: int maxSumRec( const vector<int> & a, int left, int right ) { if( left == right ) // Base case return a[ left ]; int center = ( left + right ) / 2; int

此函数将返回向量的最大连续子序列。任务是实现一个名为“L”的最小序列参数,然后返回长度至少为L的最大连续子序列

示例:不带L参数:

int maxSumRec( const vector<int> & a, int left, int right )
{
    if( left == right )  // Base case
        return a[ left ];

    int center = ( left + right ) / 2;
    int maxLeftSum  = maxSumRec( a, left, center );
    int maxRightSum = maxSumRec( a, center + 1, right );

    int maxLeftBorderSum = 0, leftBorderSum = 0;
    for( int i = center; i >= left; i-- )
    {
        leftBorderSum += a[ i ];
        if( leftBorderSum > maxLeftBorderSum )
            maxLeftBorderSum = leftBorderSum;
    }

    int maxRightBorderSum = 0, rightBorderSum = 0;
    for( int j = center + 1; j <= right; j++ )
    {
        rightBorderSum += a[ j ];
        if( rightBorderSum > maxRightBorderSum )
            maxRightBorderSum = rightBorderSum;
    }

    return max3( maxLeftSum, maxRightSum,
                maxLeftBorderSum + maxRightBorderSum );
}
vector<int> a(4);
a[ 0 ] = 1; a[ 1 ] = 3; a[ 2 ] = -20; a[ 3 ] = 7;
maxSumRec(a, 0, a.size() - 1);
向量a(4);
a[0]=1;a[1]=3;a[2]=-20;a[3]=7;
maxSumRec(a,0,a.size()-1);
将返回“7”

示例:使用L参数:

int maxSumRec( const vector<int> & a, int left, int right )
{
    if( left == right )  // Base case
        return a[ left ];

    int center = ( left + right ) / 2;
    int maxLeftSum  = maxSumRec( a, left, center );
    int maxRightSum = maxSumRec( a, center + 1, right );

    int maxLeftBorderSum = 0, leftBorderSum = 0;
    for( int i = center; i >= left; i-- )
    {
        leftBorderSum += a[ i ];
        if( leftBorderSum > maxLeftBorderSum )
            maxLeftBorderSum = leftBorderSum;
    }

    int maxRightBorderSum = 0, rightBorderSum = 0;
    for( int j = center + 1; j <= right; j++ )
    {
        rightBorderSum += a[ j ];
        if( rightBorderSum > maxRightBorderSum )
            maxRightBorderSum = rightBorderSum;
    }

    return max3( maxLeftSum, maxRightSum,
                maxLeftBorderSum + maxRightBorderSum );
}
vector<int> a(4);
a[ 0 ] = 1; a[ 1 ] = 3; a[ 2 ] = -20; a[ 3 ] = 7;
maxSumRec(a, 0, a.size() - 1);
intl=3;
载体a(4);
a[0]=1;a[1]=3;a[2]=-20;a[3]=7;
maxSumRec(a,0,a.size()-1,L);
将返回“-9”

我知道这可以很容易地用其他不同的最大和函数来完成,但这个任务是明确的递归公式。我甚至不知道如何开始。教授给了我们这样一个提示:“将minSeq添加到递归算法中造成的主要困难是边界和计算。 显然,我们可以假设两个边界序列中的每一个都必须包含至少一个元素,否则 另一方面,递归调用已经找到了最佳解决方案 另一方面,在不知道minSeq-k会发生什么的情况下,我们不知道k元素在一侧是否足够 元素。似乎需要一些搜索,这将增加最坏的情况 算法的运行时间取决于与minSeq相关的某些因素。”

int-maxSumRec(常量向量&a,int-left,int-right,int-L)
{
int center=(左+右)/2;
...
int maxBorderSum=0,leftBorderSum=0;
//对于(int i=中心;i>=左;i--)
// {
// ...
// }
//int maxRightBorderSum=0,rightBorderSum=0;
//对于(int j=center+1;j=left;i--){
leftBorderSum+=a[i];
int leftLength=中心-i+1;
int minRightLength=L—leftLength;
maxBorderSum=max(maxLeftBorderSum,leftBorderSum+dpR[minRightLength]);
}
...
返回max3(maxLeftSum、maxRightSum、maxBorderSum);

}
棘手的情况是,当考虑一个(比如说,左)边框中包含k