查找最大子向量的递归方法

时间:2010-11-20 17:11:40

标签: c++ algorithm

这里是用于查找最大子向量和的递归代码

#include <iostream>
using namespace std;

int Max(int a,int b,int c){
    return max(a,std::max(b,c));
}
int a[]={31,-41,59,26,-53,58,97,-93,-23,84};
int n=sizeof(a)/sizeof(int);
int maximum3(int l,int u){
    if (l>u) return 0;
    if (l==u) return std::max(0,a[l]);

    int m=(l+u)/2;
    int lmax=0;
    int sum=0;
    int rmax=0;
    int sum1=0;
    for (int i=m;i>=l;i--){
        sum+=a[i];
        lmax=std::max(lmax,sum);
    }
    for (int j=m+1;j<u;j++){
        sum1+=a[j];
        rmax=std::max(rmax,sum);
    }

    return Max(lmax+rmax,maximum3(l,m),maximum3(m+1,u));
}

int main(){
    cout<<maximum3(0,n-1)<<"  ";
    return 0;
}

它返回155而其他非递归方法返回187请帮助

4 个答案:

答案 0 :(得分:5)

@ user466411 :您在过去7个月内提出过 274 个问题,或者每天都提出一个问题。其中许多问题都是 [已结束] ,收到严重否定投票 [ - 5或更多] ,或两者兼而有之。

这种模式清楚地表明:
您需要重新考虑如何进行编程

  • 您需要学习使用调试器。
  • 您需要将大问题缩小到具体问题。
  • 您需要准确描述问题。
  • 在将它们组合成更大的元素之前,您需要测试一些代码。
  • 你需要尝试修复,观察效果,​​假设解决方案并测试它们。

总而言之,您正在编程 错误 大多数新程序员可以在不到7个月的时间内掌握初级编程,而无需每天手持。你需要重新编程,学习新的如何思考代码,或者你需要承认编程不适合你,你应该找到一个新的工作线。

(对其他评论者:是的,我知道这个答案对这个问题没有回应,但是迫切需要说出来;请参阅我的另一篇文章,寻找响应式答案,试图引导海报找到解决方案)

答案 1 :(得分:1)

错字,这:

rmax=std::max(rmax,sum); 

应该是

rmax=std::max(rmax,sum1);

答案 2 :(得分:1)

我写的代码并且测试正确。认为它可能有用......

#include <iostream.h>

void findMaxCrossSubArray(int a[], int low, int mid, int high, int crossCur[])
{
    int leftSum = -9999;
    int sum = 0;
    int maxLeft, maxRite;

    maxLeft = maxRite = 0;

    for (int i = mid; i >=  low; i--)
    {
        sum += a[i];
    if (sum > leftSum)
    {
        leftSum = sum;
        maxLeft = i;
    }
    }
    int riteSum = -9999;
    sum = 0;
    for (int j = mid + 1; j <= high; j++)
    {
        sum += a[j];
        if (sum > riteSum)
    {
        riteSum = sum;
        maxRite = j;
    }
    }
    crossCur[0] = maxLeft;
    crossCur[1] = maxRite;
    crossCur[2] = leftSum + riteSum;
    return;
} 

void findMaxSubArray (int a[], int low, int high, int curMax[])
{
    if (high == low)
    {
        curMax[0] = low;
    curMax[1] = high;
    curMax[2] = a[low];
    return;
    }

    int mid = (low + high)/2;

    int leftCur[3], riteCur[3], crossCur[3];
    findMaxSubArray(a, low, mid, leftCur);
    findMaxSubArray(a, mid+1, high, riteCur);
    findMaxCrossSubArray(a, low, mid, high, crossCur);

    if ((leftCur[2] >= riteCur[2]) && (leftCur[2] >= crossCur[2]))
    {
        curMax[0] = leftCur[0];
    curMax[1] = leftCur[1];
    curMax[2] = leftCur[2];
    return;
    }
    if ((riteCur[2] >= leftCur[2]) && (riteCur[2] >= crossCur[2]))
    {
        curMax[0] = riteCur[0];
    curMax[1] = riteCur[1];
    curMax[2] = riteCur[2];
    return;
    }

    curMax[0] = crossCur[0];
    curMax[1] = crossCur[1];
    curMax[2] = crossCur[2];
    return;
}   

int main()
{
    int a[] = {13, -3, -25, 20, -3, -16, -23, 18, 20,-7, 12, -5, -22, 15, -4, 7};
    int curMax[] = {0,0,0};

    findMaxSubArray(a, 0, 15, curMax);

    cout << curMax[0] << "," << curMax[1] << "," << curMax[2] << endl;
}    

答案 3 :(得分:0)

您认为最大子向量总和在哪里,生成答案187?
我相信这是序列:[59, 26, -53, 58, 97]

哪个子向量和会产生155的答案?
我相信这是序列:[58, 97]

为什么你的算法不能在更大的子向量和上拾取?
这是一个非常好的问题。您可以使用基本的调试技术自行解答。

在第一次通话结束时,您的LMax应为22,RMax应为123,TotalSum应为145 (通过跟踪程序找到)手工)。你同意吗?

第二次调用maximum3会产生什么?