求数组中的最大子数组1
题目要求:
(1)输入一个整形数组,数组里有正数也有负数。
(2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
(3)求所有子数组的和的最大值。要求时间复杂度为O(n)
题目实现方法:(1)暴力求解 (2)分治算法 (3)动态规划算法
(3)动态规划算法:
设计思路:
设数组为A[],先求的数组A[0]到A[j]中的最大子数组及最大子数组的和SUM;再根据SUM的值,求得数组A[0]到A[j+1]的最大子数组以及最大子数组的和。按照此步骤,一直求到数组A[]的最后一个数为止。
#include<iostream> #include<string> using namespace std; int main() { //动态规划的方法 int intArray[100]; //输入数据的数组 int intNum; //用户输入的数量限制 int intPre; //记录最大子数组中的第一个数的位置 int intAfter; //记录最大子数组中的最后一个数的位置 int intSum; //最大值,记录的是最大子数组的最大值 int intCurSum; //当前最大值 intSum = -65535; intCurSum = 0; intNum = 0; cout << "请输入数组(最大不要超过100个数):" << endl; for (int i = 0; i < 100; i++) { if (cin.peek() == 10) { cin.clear(); break; } cin >> intArray[i]; intNum++; } intPre = 0; //初始化最大子数组的第一个数的位置为0 for (int i = 0; i < intNum; i++) { intCurSum = intCurSum + intArray[i]; if (intCurSum>intSum) { intSum = intCurSum; intAfter = i; } if (intCurSum < 0) { intSum = 0; intCurSum = 0; intPre = i+1; } } cout << "最大的子数组为:"; for (int i = intPre; i <= intAfter; i++) { cout << intArray[i] << " "; } cout << endl; cout << "最大的子数组的和为:" << intSum << endl; return 0; }
实验截图: