要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。
我们根据只有前半部分的和为正数时,才有可能在子数组求和的时候可能最大,算法是当从头开始,遍历的元素求和为正数时,继续向后遍历,当求和为负数时,重新开始计算求和,子数组的开始重置为下一个元素要求。
程序:
#include<iostream>
using namespace std;
int max(int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
int main()
{
int Array[10000];
int i = 1,k;
int dynamic_planning[10000][2], j, sum[10000];
int start[10000] = {0};
int end[10000] = { 0 };
cout << "请输入数组:" << endl;
cin >> Array[0];
while (cin.get() != '
')
{
cin >> Array[i++];
}
for (j = i; j < 2 * i; j++)
{
Array[j] = Array[j - i];
}
int n = 0;
while (true){
dynamic_planning[0][0] = 0;
dynamic_planning[0][1] = Array[n];
for (j = 1; j<i; j++)
{
dynamic_planning[j][0] = max(dynamic_planning[j - 1][0], dynamic_planning[j - 1][1]);
dynamic_planning[j][1] = max(Array[j+n], (dynamic_planning[j - 1][1] + Array[j+n]));
if (dynamic_planning[j - 1][1] < dynamic_planning[j][1] && dynamic_planning[j - 1][1]<0 && dynamic_planning[j][0] <= dynamic_planning[j][1])
{
start[n] = j+n;
}
if (dynamic_planning[j - 1][1] >= dynamic_planning[j][0])
{
end[n] = j-1+n;
}
if (dynamic_planning[j][1] >= dynamic_planning[j][0])
{
end[n] = j+n;
}
}
sum[n] = max(dynamic_planning[i - 1][0], dynamic_planning[i - 1][1]);
n++;
if (n == i)
{
break;
}
}
int max = sum[0];
n = 0;
for (j = 0; j < i; j++)
{
if (sum[j]>max)
{
max = sum[j];
n = j;
}
}
cout << "最大的子数组为:" << endl;
if (start[n] <= end[n])
{
for (j = start[n]; j <= end[n]; j++)
{
cout << Array[j] << " ";
}
}
else
{
for (j = start[n]; j < i; j++)
{
cout << Array[j] << " ";
}
for (j = 0; j <= end[n]; j++)
{
cout << Array[j] << " ";
}
}
cout << endl;
cout << "开始检索: " << start[n];
if (end[n] >= i)
cout << "结束检索: " << end[n] - i;
else
cout << "结束检索: " << end[n];
cout << endl;
//cout << start << " " << end << endl;
cout << "最大的子数组的和为:" << sum[n] << endl;
return 0;
}
运行程序截图:
合作照片:
遇到的问题:
程序不知道怎么返回最大数组的位置。
总结:这项作业参考了网上前辈的程序,并根据自己的思路和课上老师讲授的思路进行编程,同伴主要负责调试代码,调试工作复杂,编写代码的工作更是没有头绪,还好最后经过一起努力完成作业。