您的位置:首页 > 其它

二维数组最大子数组和

2015-03-26 17:59 295 查看
一.实验题目

求一个二维数组中和最大的子数组。

二.实验思路

基于我们第一次合作时求的一位数组最大子数组,加上一层循环来遍历二维数组中的所有子矩阵的情况。

第一步:先利用上次的方法求每一行的情况,将每行结果存入一个一位数组中,构成一个二维数组A[][]。

第二步:将上述二维数组每一列利用求每一行的方法再次遍历。将每个结果与A[][]中的值比较取大值。

第三步:输出这个最大值。

三.代码

// ketang5.cpp : 定义控制台应用程序的入口点。
//人员:   张世通 梁世豪

#include "stdafx.h"
#include "iostream"
#include "fstream"
using namespace std;

/*二维数组压缩函数*/
void yasuo(int **Source,int **Destion,int row,int line)
{//将每一行的数组元素都用枚举法求出子数组
int i,j,add,count;
for(i=0;i<row;i++)
{
count=0;
for(j=0;j<line;j++)
{
add=0;
for(int l=0;l<line-j;l++)                            //每一行按顺序进行枚举存入数组中
{
add=add+Source[i][j+l];
Destion[i][count+l]=add;
}
count=count+line-j;
}
}
}

/*求最大值函数*/
int Max(int **Destion,int row,int line)
{
int i,j,add,max;
max=Destion[0][0];                                                //将数组的第一个数赋值给max
for(j=0;j<line;j++)
{
for(i=0;i<row;i++)
{
add=0;
for(int r=0;r<row-i;r++)
{
add=add+Destion[r+i][j];                            //逐列对数组进行枚举,求最大值
if(max<add)
{
max=add;
}
}
}
}
return max;
}

/*数组初始化*/
void chushihua(int**Arr,int row,int line)
{
cout<<"请输入数组数据"<<endl;
for(int i=0;i<row;i++)
{
for(int j=0;j<line;j++)
{
cin>>Arr[i][j];
}
}
}

/*释放空间*/
void Delete(int **Arr,int row)
{
for(int i=0;i<row;i++)
{
delete[]Arr[i];
}
delete[]Arr;
}
int main()
{
char s;
int row,col1,col2;                                //定义行数列数
cout<<"请输入行数:";
cin>>row;
cout<<"请输入列数:";
cin>>col1;
int **A;                                        //动态定义二维数组
int **B;
col2=col1*(col1+1)/2;
A=new int*[row];
for(int k=0;k<row;k++)
{
A[k]=new int[col1];
}
B=new int*[row];
for(int l=0;l<row;l++)
{
B[l]=new int[col2];
}
chushihua(A,row,col1);
yasuo(A,B,row,col1);
int max=Max(B,row,col2);
cout<<"最大子数组之和为:"<<max<<endl;
cout<<endl;
cout<<"是否继续(Y/N)";
cin>>s;
while(s!='Y'&&s!='y'&&s!='N'&&s!='n')
{
cout<<"输入错误,请重新输入(Y/N)";
cin>>s;
}
if(s=='Y'||s=='y')
{
main();
}
else                                            //释放数组空间
{
Delete(A,row);
Delete(B,row);
}
return 0;
}


四.运行截图



五.收获体会

第一点,这次结对开发的过程让我学会了利用已有资源进行程序的开发,正是有了上次一位数组求最大子数组的基础,这次求二维数组最大子数组才有了正确的思路。

第二点,这是和世通的第二次结对开发程序,他的思路很清晰,编程能力也很好,有很多值得我学习的地方。以后应该还有很多合作的机会,我都会珍惜的。

第三点,我觉得结对开发这个主意应该早点应用到我们的学习中,这种方法下我们会尽力去思考问题的解决方法,基础差一点的在另一方的影响下也会学到不少实用的东西。而不是遇见不会的就百度一个程序去应付老师而造成恶性循环,给自己扣上一个“不会编程”的帽子来逃避。

六.合影

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