这里是用于查找最大子向量和的递归代码
#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请帮助
答案 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会产生什么?