首页 > 编程语言 > 详细

课堂4—结对开发(求数组中子数组和的最大值升级!)

时间:2015-03-25 23:09:49      阅读:259      评论:0      收藏:0      [点我收藏+]

成员:林彦汝、张金

题目:

  返回一个二维整数数组中最大子数组的和。

思路:

  我们最开始的思路是在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;
}        

 

运行结果:

技术分享

 

合照: 加油吧!小伙伴.

技术分享

课堂4—结对开发(求数组中子数组和的最大值升级!)

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!