您的位置:首页 > 其它

返回一个二维整数数组中最大子数组的和(头尾相接)

2015-06-17 19:42 274 查看
1.题目。

题目:返回一个二维整数数组中最大子数组的和。
要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

2.设计思想。

分别求出每一行的最大子矩阵,然后再两行相加,求出最大子矩阵,一直到所有的行相加,求出最大子矩阵。比较其中最大的子矩阵值,找出最大的。

3.代码。

#include<iostream>
using namespace std;
#include <ctime>
#include <cstdlib>
#define MAX 10000
int Max(int b[])
{
int m[MAX],n=0,p=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
n=n+b[i+j];
m[p]=n;
p++;
}
n=0;
}
int max=m[0];
for(i=0;i<p;i++)
{
if(m[i]>max)
max=m[i];
}
return max;
}

int main()
{
int k[MAX],a[4][8],h[8];
srand(time(0));
cout<<"该矩阵为:"<<endl;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
a[i][j]=rand()%100-50;
a[i][j+4]=a[i][j];
cout<<a[i][j]<<" ";
}
cout<<endl;
}
for(i=0;i<4;i++)
{
k[i]=Max(a[i]);
}
int  q=4;
for(i=0;i<3;i++)
{
int    t=0;
for(int j=0;j<8;j++)
{

h[t]=a[i][j]+a[i+1][j];
t++;
}
k[q]=Max(h);
q++;
}
for(i=0;i<2;i++)
{
int    t=0;
for(int j=0;j<8;j++)
{

h[t]=a[i][j]+a[i+1][j]+a[i+2][j];
t++;
}
k[q]=Max(h);
q++;
}
int t=0;
i=0;
for(int j=0;j<8;j++)
{

h[t]=a[i][j]+a[i+1][j]+a[i+2][j]+a[i+3][j];
t++;
}
k[q]=Max(h);
q++;
cout<<endl;
int max=k[0];
for(i=0;i<q;i++)
{
if(k[i]>max)
max=k[i];
}
cout<<"最大子矩阵的值为:"<<endl;
cout<<max;
return 0;
}


4.运行结果。

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