成员:林彦汝、张金
题目:
返回一个二维整数数组中最大子数组的和。
思路:
我们最开始的思路是在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