您的位置:首页 > 其它

求数组中的最大子数组1

2016-03-25 22:00 260 查看
题目要求:
(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;
}


实验截图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: