您的位置:首页 > 其它

二维数组求最大矩阵

2015-04-09 21:21 169 查看
一、项目思路:

假设f(i,j)表示以第i行开始,到第j行结束的矩阵中子矩阵的最大和

为了求f(i,j),我们对这个矩阵(第i行开始,到第j行结束的矩阵)进行处理:

(1)把这个矩阵中的每一列数相加,最后形成一个一维数组,其长度等于原二维数组列的个数。

(2)在该一维数组上,求解最大子数组和。

二、项目代码:

#include<iostream>
using namespace std;

int MAX(int s[],int n)
{
int i,sum=0,max=s[0];
for(i=0;i<n;i++)
{
if(sum>0)
{
sum=sum+s[i];
}
else
{
sum=s[i];
}
if(sum>max)
{
max=sum;
}
}
return max;
}

int MIN(int s[],int n)
{
int i,sum=0,min=s[0];
for(i=1;i<n;i++)
{
if(sum<0)
{
sum=sum+s[i];
}
else
{
sum=s[i];
}
if(sum<min)
{
min=sum;
}
}
return min;
}

int SUM(int s[],int n)
{
int i,sum=0;
for(i=0;i<n;i++)
{
sum=sum+s[i];
}
return sum;
}

void main()
{
int m,n,i,j,a[100][100];
cout<<"请输入矩阵的行数和列数:";
cin>>m>>n;
cout<<"请输入矩阵元素"<<endl;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cin>>a[i][j];
}
}
int sum,max,s[100],k=0,min,p=a[0][0];
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
s[j]=0;
}
while(k+i<m)
{
for(j=0;j<n;j++)
{
s[j]=s[j]+a[k+i][j];
}
sum=SUM(s,n);
min=MIN(s,n);
max=MAX(s,n);
if(sum-min>max)
{
max=sum-min;
}
if(max>p)
{
p=max;
}
k++;
}
k=0;
}
if(m==1&&n==1) p=a[0][0];
cout<<"子矩阵最大值为"<<p<<endl;
}


三、测试结果:





四、项目总结:

经过结对开发,更能促使自己完成任务,完成老师安排的作业。项目测试阶段使自己对程序从头学习,需要自己耐心测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: