一,题目要求:
输入一个二维数组,求出此二维数组的最大子数组和。
二,设计思路:
利用for循环进行遍历,求出数组中每一个子数组的和,最终求出这些子数组的最大的一个值。程序中利用了调用函数,被调函数分别用来求每一个子数组的和及子数组的最大值。这样主函数就比较简单,定义变量和控制输入输出就可以了。
三,具体程序代码:
#include<iostream>
#include<conio.h>
using namespace std;
int *sum_i_j(int **data,int cols,int i,int j){
int *sum=new int[cols];
memset(sum,0,sizeof(int)*cols);
for(int col=0;col<cols;col++){
for(int row=i;row<=j;row++){
sum[col]+=data[row][col];
}
}
return sum;
}
int maxSum(int *dataCols,int cols){
int max=dataCols[0];
int *sum=new int[cols];
memset(sum,0,sizeof(int)*cols);
sum[0]=dataCols[0];
for(int i=1;i<cols;i++){
sum[i]=dataCols[i];
if(sum[i]<(sum[i-1]+dataCols[i])){
sum[i]=sum[i-1]+dataCols[i];
}
if(sum[i]>max)
max=sum[i];
}
delete sum;
return max;
}
int maxSubSum(int **data,int rows,int cols){
int max=-0x3f3f3f3f;
int *sumTmp=new int[cols];
for(int i=0;i<rows;i++){
for(int j=i;j<rows;j++){
sumTmp=sum_i_j(data,cols,i,j);
int tmp=maxSum(sumTmp,cols);
if(tmp>max){
max=tmp;
}
}
}
delete sumTmp;
return max;
}
int main(){
/************************************************************************/
/*
4 4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2 */
/************************************************************************/
int rows,cols;//定义变量行,列
int jixu;
int **data=new int*[rows];//二维数组传值很麻烦
cout<<"请输入数组的行数rows=";
cin>>rows;
cout<<"请输入数组的列数cols=";
cin>>cols;
cout<<"请输入数组每个元素的数值:"<<endl;
for(int i=0;i<rows;i++)
{
data[i]=new int[cols];///
for(int j=0;j<cols;j++)
{
cin>>data[i][j];
}
}
cout<<"此数组最大子数组和为:"<<maxSubSum(data,rows,cols)<<endl;
cout<<"请选择是否要继续输入?(1,是 2,退出)"<<endl;
cin>>jixu;
if(jixu==1)
{
cout<<endl;
main();
}
else
{
return 0;
}
getch();
system("pause");
return 0;
}
四,程序的运行结果:
五,实验总结:
本次实验内容较之上次比较复杂,增加了数组的维数,在编写程序时使用到了指针变量,因为对C++的编写有些遗忘,故而通过查阅相关书籍资料找到了数组与指针之间的联系及使用方法。由于编写四则运算2的程序时使用了函数的调用,所以这次编写程序时对函数的调用这一部分比较熟悉,能够较快想出被调函数及主函数。这次的结对开发,小伙伴主要负责敲代码,我则主要负责审查代码的规范。通过两人结组的方法,能够发现各自的优缺点,互相促进,而且不同的解题思路的碰撞也使得我们的代码更加完善,更具有利用价值,便于今后的扩展。