我太菜了,我是辣鸡,完全不会写c++的递归,我目前用的求子序列的和函数必须要return啊。但是吧变量定义成static返回数组,感觉会出问题。先学吧,以后再来整
- 利用分治算法求解一个序列的最大子序列
分治算法有三步(第三步忘记了,明天补充):
分解:
合并:
还有好多语法不会,明天再写吧
现在报错1fenzhi.cpp:(.text+0x1b3): undefined reference to `CSuanFa::GetMaxSubList(double*, int*, int, int)’
collect2: error: ld returned 1 exit status
明天研究:笨比自己,发现原因,c++类方法定义是ClassName::FuncName,昨天没写ClassName::导致报错。
#include#include using namespace std; class CSuanFa { public: double FatherList[9]; //后面用构造函数给他赋值 //以下所有函数应该返回数组的 int *GetMaxSubList(double FatherList[9], int iStart, int iEnd); int *GetCrossMaxSub(double FatherList[9], int iLeftIdx, int iRightIdx, int iMid); }; int *CSuanFa::GetMaxSubList(double FatherList[9], int iLeftIdx, int iRightIdx) { static int res[3] = {0, 0, 0}; if (iLeftIdx == iRightIdx) { *res = iLeftIdx; *(res + 1) = iRightIdx; *(res + 2) = *(FatherList + iLeftIdx); return res; } //下面递归 //获取左边最大子序列 int iMid = int((iLeftIdx + iRightIdx) / 2); int *leftMax = this->GetMaxSubList(FatherList, iLeftIdx, iMid); //获取右边最大子序列 int *rightMax = this->GetMaxSubList(FatherList, iMid + 1, iRightIdx); //获取包含中点的最大子序列 int *crossMax = this->GetCrossMaxSub(FatherList, iLeftIdx, iRightIdx, iMid); //返回三个子序列中和最大的 if (*(leftMax + 2) > *(rightMax + 2)) { if (*(leftMax + 2) > *(crossMax + 2)) { return leftMax; } else { return crossMax; } } else { if (*(rightMax + 2) > *(crossMax + 2)) { return rightMax; } else { return crossMax; } } } int *CSuanFa::GetCrossMaxSub(double FatherList[9], int iLeftIdx, int iRightIdx, int iMid) { int iTotalSum = INT_MIN; int iLeftSum = 0; int iResLeftIdx = 0; int iResRightIdx = 0; for (int i = iMid; i >= iLeftIdx; i--) { iLeftSum = iLeftSum + *(FatherList + i); if (iLeftSum >= iTotalSum) { iTotalSum = iLeftSum; iResLeftIdx = i; } } int iRightSum = 0; for (int i = iMid + 1; i <= iRightIdx; i++) { iRightSum = iRightSum + *(FatherList + i); if (iRightSum + iTotalSum >= iTotalSum) { iTotalSum = iLeftSum; iResRightIdx = i; } } static int res[3] = {iResLeftIdx, iResRightIdx, iTotalSum}; return res; } int main() { double FatherList[9] = {1, 4, -3, 7, -9, 4, 8, 1, -7}; CSuanFa oSuanfa; int *result = oSuanfa.GetMaxSubList(FatherList, 0, 8); for (int i = 0; i < 3; i++) { cout << "The result is:" << *(result + i) << endl; } }



