您的位置:首页 > 其它

数组系列练习二

2016-03-26 20:39 302 查看
题目要求:

返回一个整数数组中最大子数组的和。

输入一个整形数组,数组里有正数也有负数。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。

设计思路:

从尾往头扫描,找出最大值max1,并记录最大位置i,再从头往尾扫描,找出最大值max2, 并记录最大位置j,若i>j,则比较max1+max2与max,求出最大值,若i<=j,则令max = A[0]+A[1]+A[2]+...A[n-1],求出max和MaxSum之间的最大值,即最后比较MaxSum和sum的值。

实验代码:

#include<iostream>
using namespace std;
int FindMaxSum(int A[], int n)

{
int value;
int start, end;
//用来保证输入数组正确
if (A == NULL || n <= 1)

{
cout << "error input" << '\n';//报错,用户提醒
exit(0);//异常退出
}
//一个元素的数组
if (n == 1)
return A[0];
//从前往后找最大子数组的和
int pos = 0;
int CurSum = A[0];
int MaxSum = A[0];
for (int i = 1; i<n; ++i)
{
if (CurSum <= 0)
CurSum = 0;
CurSum += A[i];
if (CurSum >= MaxSum)
{
MaxSum = CurSum;
pos = i;
}
}
int pos1 = 0, max1 = A[0];
CurSum = A[0];
for (int i = 1; i <= n - 1; ++i)
{
CurSum += A[i];
if (CurSum >= max1)
{
max1 = CurSum;
pos1 = i;
}
}
//从后往前找最大子数组的和
CurSum = A[n - 1];
int pos2 = n - 1, max2 = A[n - 1];
for (int j = n - 2; j >= 0; --j)
{
CurSum += A[j];
if (CurSum >= max2)
{
max2 = CurSum;
pos2 = j;
}
}
//对首尾相接情况的处理
int sum = 0;
if (pos1 >= pos2)
{
for (int i = 0; i<n; ++i)
sum += A[i];
}
else
{
for (int i = 0; i <= pos1; ++i)
{
sum += A[i];
}
for (int j = n - 1; j >= pos2; --j)
{
sum += A[j];
}
}
int temp = MaxSum>sum ? MaxSum : sum;
if (MaxSum == temp)
{
end = pos;
while (temp != 0)
{
temp -= A[pos--];
}
start = ++pos;
}
else
{
if (pos1 >= pos2)
{
start = 0;
end = n - 1;
}
else
{
end = pos2;
start = pos1;
}
}
value = MaxSum>sum ? MaxSum : sum;//比较sum和MaxSum的值
cout << "最大连续子数列的和:"<<value<<endl;//输出和
cout << "最大连续子数列:" << start<<"---"<< end<<endl;//输出位置
}
//控制数组的输入引用函数
int main()
{
int i, n;
int A[50];
cout <<"请输入数组的长度:"<< endl;
cin >> n;
cout << "请依次输入数组中的数:" << endl;
for (i = 0; i != n; ++i)
cin >> A[i];
FindMaxSum(A, n);

}


实验截图:





实验总结:

通过本次实验,我学到了要将抽象的问题具体化,利用不一般的方法去解决问题,在原来的基础上加入首尾相接这个条件要求,动态规划嵌入程序里面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: