您的位置:首页 > 其它

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

2016-04-06 12:32 295 查看
一、题目及要求:

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

输入一个二维整形数组,数组里有正数也有负数;二维数组首尾相接,像一条首尾相接的带子一样。

二、设计思路:

把数按行分成几个一维数组,对于该一维数组,求出他们的最大连续数组之和,并且记录下最大连续数组的第一位和最后一位的位置,之后判断几个一维数组的最大连续数组的位置是否相接或包括(如,第一行是1和4,第二行是3和5,这样就相连)。最后在加上没有包括的

#include<iostream>
using namespace std;
struct point
{
int x, y;
};

int add(int a[5][5], int i, int j, int k)
{
int n;
int b = 0;
for (n = j; n <= i + j; n++)
{
b += a
[k];
}
return b;
}

void main ()
{
int x=5,y=5,i, j, k, l;
int sum = 0, s, h, e;
point head;
point end;
int a[5][5];
int b[5];
cout << "请输入数组中的数:" << endl;
for (i = 0; i<x; i++)
{
for (j = 0; j<y; j++)
{
cin>>a[i][j];
}
}
for (i = 0; i<x; i++)
{
for (j = 0; i + j<x; j++)
{
s = 0;
h = 0;
e = 0;
for (k = 0; k<y; k++)
{
b[k] = add(a, i, j, k);
}

for (l = 0; l<x; l++)
{
s += b[l];
if (s>0)
{
e++;
}
else
{
s = 0;
h = l + 1;
e++;
}
if (s>sum)
{
sum = s;
head.x = h;
head.y = j;
end.x = e;
end.y = i + j;
}
}
if (s>0 && h != 0)
{
l = 0;
e = e - x;
while (s>0 && e != h - 1)
{
s += b[l];
l++;
e++;
if (s>sum)
{
sum = s;
head.x = h;
head.y = j;
end.x = e;
end.y = i + j;

}

}

}

}

}
cout<<"最大子数组的和为:"<<sum<<endl;
cout<<"最大子数组为:"<<endl;
if (end.x>head.x)
{
for (i = head.y; i <= end.y; i++)
{
for (j = head.x; j<end.x; j++)
{
cout<<a[i][j]<<" ";
}
cout << endl;
}
}
else
{
for (i = head.y; i <= end.y; i++)
{
for (j = head.x; j < x; j++)
{
cout << a[i][j] << " ";
}
for (j = 0; j < end.x; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
}
system("pause");
}


四、运行结果



五、感想

这次编写代码时明显感觉到了困难,因为二维联通数组的情况更为多变使得好多情况必须考虑,因此增加了编程的难度。

结对开发伙伴:朱建颖 http://www.cnblogs.com/zjy666/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: