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;
    }        
    

     

    运行结果:

     

    合照: 加油吧!小伙伴.

  • 相关阅读:
    python 并发编程 多线程 event
    python 并发编程 多线程 定时器
    python 并发编程 多线程 信号量
    linux top 查看CPU命令
    python 并发编程 多线程 GIL与多线程
    python 并发编程 多线程 死锁现象与递归锁
    python 并发编程 多线程 GIL与Lock
    python GIL全局解释器锁与互斥锁 目录
    python 并发编程 多线程 GIL全局解释器锁基本概念
    执行python程序 出现三部曲
  • 原文地址:https://www.cnblogs.com/mumulucky/p/4366991.html
Copyright © 2011-2022 走看看