zoukankan      html  css  js  c++  java
  • 求数组中最大子数组的和(二维)

    成员:林彦汝、张金

    题目:

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

    思路:

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

     

    运行结果:

     

    合照: 加油吧!小伙伴.

  • 相关阅读:
    类的内部成员之五-----内部类
    接口的使用
    java中abstract关键字的使用
    Redis主从复制原理——哨兵模式(Sentinel)
    Redis主从复制原理——薪火相传
    Redis主从复制原理——一主二仆
    Git---使用Github实现团队内协作操作步骤
    Final知识点总结
    代码块知识点总结
    Linux学习计划
  • 原文地址:https://www.cnblogs.com/mumulucky/p/4366991.html
Copyright © 2011-2022 走看看