成员:林彦汝、张金
题目:
返回一个二维整数数组中最大子数组的和。
思路:
我们最开始的思路是在arr[rows][cols]二维数组中,把子数组分为几类:只有1个元素的、有2个元素的、...、有rows*cols个元素的。分别把这几类子数组的和存进另一个数组max[]里,再求出max数组里的最大值即可;思路二:把二维数组转化成一维数组。
总结体会:
这次把总结提前。首先说我们的思路,没有像课上发言的同学那么做,因为我们觉得实现起来比较难,想在上一次题目的基础上扩展,但实际上在开始进行中我们就发现许多问题,如果将二维数组转为一维数组就会出现不连续的情况;怎么让所有子数组的和与数组max[]关联起来;再者若包含有4个元素的子数组,这些元素可能在一行或者一列,更可能它们是一个田字格结构,这些情况还能用递归吗;还有关于文件一直都是我们的弱项,改了很久也没能把“,”给分析出来,最后还是决定直接给出提示,然后输入。
感觉二维数组一下子难度就大了,并不是想象中的那样有些困难。然后我们就改了思路,以列作为单位进行展开,引进指针(因为指针是地址,并不改变数值,但是感觉指针真的很难),求出每列的值,与相邻列的值,不断扩大,从第一行到第二行...用到枚举法,先枚举列后到行。因为指针很容易出错,所有写很久功能还是没能实现,在CSDN论坛上看见一篇思路与我们类似的文章,然后把他的代码与我们进行对比,然后调试分析。
因为各种原因,这次结对开发两人讨论的时间相对较少,而且每次也都存在很多问题,更是新的问题也不断出现,许多的不足让我们否定原有的思路,而后又重头开始,浪费了不少时间。所以,老师原谅这次我们没有编出成功的代码吧。我们会继续修改自己的程序,实现更好的功能。
源代码:
#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()
{
int rows,cols; //定义变量行,列
int **data=new int*[rows];
cout<<"input rows : ";
cin>>rows; //输入行
while(rows<=0)
{
cout<<"illegal input! Again :";
cin>>rows;
}
cout<<"input cols : ";
cin>>cols; //输入列
while(cols<=0)
{
cout<<"illegal input! Again :";
cin>>cols;
}
cout<<"input array numbers :"<<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 = "<<maxSubSum(data,rows,cols)<<endl;
return 0;
}
运行结果:

合照: 加油吧!小伙伴.

原文:http://www.cnblogs.com/mumulucky/p/4366991.html