您的位置:首页 > 其它

题目:返回一个二维整数数组中最大子数组的和。

2015-04-13 12:53 260 查看
#include<iostream>
#include<ctime>
using namespace std;
#define M 4
#define N 4

int maxline(int *array, int len)       //求一维数组最大子序列和
{
int i, sum = array[0], b = 0,j = 0;
for (i = 0; i<len; ++i)
{
if (b>0)
b += array[i];
else
b = array[i];
if (b>sum)
sum = b;
}
return sum;
}
int maxtwodimension(int n, int m, int array[M]
)
{
int i, j, h,g, max, sum = -1000;
int b[100];
for(g = 0;g < m;g++){
for (i = 0; i<n; i++)
{
memset(b, 0, sizeof(b));       //将b[100]中的数字全部初始化为0
for (j = i; j<n; j++)          //把第i行到第n行相加,对每一次相加求出最大值
{
for (h = g; h<m; h++)
{
b[h] += array[j][h];   //求一行的和,二维数组压缩成一维数组
}
max = maxline(b, h);   //按照一维数组求最大子数组的方法,求最大子序列和

if (max>sum)
sum = max;
}
}
}

return sum;
}
int main()
{
int arr[M]
;
cout << "随机二维数组为:" << endl;
srand((unsigned)time(0));
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
arr[i][j] = rand() % 100-25;
cout << arr[i][j] << " ";
}
cout << endl;
}
cout <<"最大子矩阵和为:  "<< maxtwodimension(M, N, arr) << endl;
return 0;
}


设计思路:我还是根据一维数组的求解过程,把二维数组先求出每一行的和储存到一维数组中,根据一维数组的求解过程求出二维数组最大的数组,然后逐步缩小二维数组的行数和列数继续按照一维数组求最大子数组的方法求解。但是使用了o(n4)暂时还是想不出来o(n)的计算方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: