题目:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)
合作伙伴:张江鹏
http://home.cnblogs.com/u/gaara-zhang/
设计思路:
本来我和我的小伙伴打算用分情况的方法来处理这个问题,就是根据数组中各个子数组中正负数的位置进行讨论,不过这样情况也是特别多,用到很多循环。不过幸亏老师在上课时让同学讲了讲关于动态规划的知识给了我们启发。
#include<iostream> using namespace std; int main() { int Array[100]; int max(int A,int B); int i, length = 0;//用来记录数组长 int sumOfArray;//sumOfArray用于存放包含目前的子数组的和的最大值 int sum = 0;//sum用来存放不包含当前数的所有子数组的和的最大值 cout << "请输入数组:" ; for (length = 0;;) { cin >> Array[length]; length++; if (getchar() == ' ') { break; } } sumOfArray = Array[0]; for (i = 1; i < length; i++) { sum = max(sum, sumOfArray); sumOfArray = max((sumOfArray+Array[i]), Array[i]); } sumOfArray = max(sum, sumOfArray); cout << "这个整数数组的子数组之和的最大值为:" << sumOfArray << endl; return 0; } int max(int A, int B) { if (A > B) { return A; } else { return B; } }