- 前言
- 一、最大子段和问题
- 二、算法思路
- 三、源码
- 四、举例结果
- 总结
前言
分治法–最大子段和问题
一、最大子段和问题
给定的某个序列,由n个整数所构成。最大子段和问题,就是求解该序列某段和最大值。例如,我们所输入的序列r[6]={-20,11,-4,13,-5,-2},则该序列的最大子段和为20。某支股票基金某段时间的最高涨幅,也可以抽象成最大子段和问题,
二、算法思路采用分治法的思想,将该序列一分为二,分别求取这两个序列的最大子段和。当然最大字段和也可能跨越在这两段中,即为我们要探讨的第三种情况。
//分治法--最大子段和问题 #include四、举例结果 总结using namespace std; //最大子段和问题 int MaxSum(int r[], int left, int right) { int Sum = 0, MidSum = 0, LeftSum = 0, RightSum = 0; int center, s1, s2, lefts, rights; //如果序列长度为1,那么该值即为最大字段和的结果 if (left == right) { Sum = r[left]; } else { center = (left + right) / 2; //所划分的中点 LeftSum = MaxSum(r, left, center); //左子序列,递归求解 RightSum = MaxSum(r, center + 1, right);//右子序列,递归求解 //求解左子序列 s1 = 0; lefts = 0; for (int i = center; i >= left; i--) { lefts += r[i]; if (lefts > s1) { s1 = lefts; } } //求解右子序列 s2 = 0; rights = 0; for (int j = center + 1; j <= right; j++) { rights += r[j]; if (rights > s2) { s2 = rights; } } //求和选择最大子段和 MidSum = s1 + s2; if (MidSum < LeftSum) { Sum = LeftSum; } else if (MidSum < RightSum) { Sum = RightSum; } else { Sum = MidSum; } } return Sum; } int main() { //输入输出 测试数组 int BeginTestList = 0, LenTestList; cout << "请输入你要测试的数值长度:"; cin >> LenTestList; int* TestList = new int[LenTestList]; cout << "请输入要测试的数组值:" ; for (int i = 0; i < LenTestList; i++) { cin >> TestList[i]; } cout << "测试数组值:"; for (int i = 0; i < LenTestList; i++) { cout << TestList[i] << " "; } cout << endl; //最大字段和结果 int result = MaxSum(TestList, BeginTestList, LenTestList - 1); cout << "测试数组 最大子段和:" << result << endl; //释放空间 delete[]TestList; return 0; }
就这样吧,希望对你有所帮助。



