zoukankan      html  css  js  c++  java
  • 求一个二维数组的最大子数组

    小组成员:周其范  胡宝月

    上课的时候老师布置的题目是求一个二维数组的最大子数组,因为以前的时候老师要求我们做过一个题目就是求一个数组的最大子数组,当时的方法就是利用循环把所有可能算出,然后比较那个最大就是那个,也就是所说的枚举法。因此这次我们同样的想到了枚举法。但当我们讨论的时候发现了二维有些麻烦,所以我俩在想有没有什么别的方法,最后我们想到了其实二维数组和一位数组有相似之处,可以先把二维数组变成一维数组在算。

    对于imin和imax之间的的每一列,都相当于一个一维的元素,假设数组是BC,那么BC[j]=array[imin][j]+....+array[imax][j]。而由图片中可看到我们可以知道对于imin行和imax行之间的区间第j列的值是
    A(PartSum,imin,imax,j)=PartSum[imax][j]-PartSum[imin-1][j]-PartSum[imax][j-1]+PartSum[imin-1][j-1]

    复制代码
    // MaxMatrix.cpp : 定义控制台应用程序的入口点。
    //
    #include "stdafx.h"
    #include <iostream>
    #include <limits>
    using namespace std;
    
    #define N 4
    #define M 3
    
    int BC(int (*PartSum)[M+1],int imin,int imax,int j) //imin--imax第j列的和
    {
        int value;
        value=PartSum[imax][j]-PartSum[imin-1][j]-PartSum[imax][j-1]+PartSum[imin-1][j-1];
        return value;
    }
    
    //求二维数组的连续子数组之和的最大值
    int MaxSum(int (*array)[M])
    {
        int PartSum[N+1][M+1];
        int i,j;
        for(i=0;i<=N;i++)
            PartSum[i][0]=0;
        for(j=0;j<=M;j++)
            PartSum[0][j]=0;
        for(i=1;i<=N;i++)
            for(j=1;j<=M;j++)
                PartSum[i][j]=PartSum[i-1][j]+PartSum[i][j-1]-PartSum[i-1][j-1]+array[i-1][j-1];
        int MaxSum=INT_MIN;
        int Start,All;
        int imin,imax;
        for(imin=1;imin<=N;imin++)
        {
            for(imax=imin;imax<=N;imax++)
            {
                Start=BC(PartSum,imin,imax,M);
                All=BC(PartSum,imin,imax,M);
                for(j=M-1;j>=1;j--)
                {
                    if(Start>0)
                        Start+=BC(PartSum,imin,imax,j);
                    else
                        Start=BC(PartSum,imin,imax,j);
                    if(Start>All)
                        All=Start;
                }
                if(All>MaxSum)
                    MaxSum=All;
            }
        }
        return MaxSum;
    }
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int a[N][M]={
            1,2,3,
            4,0,-2,
            -8,2,2,
            9,3,-4
        };
        int maxSum=MaxSum(a);
        cout<<maxSum<<endl;
        getchar();
    
        return 0;
    }
    复制代码
  • 相关阅读:
    Java http方式提交短信到短信网关
    表单提交set集合问题
    java 追加文件
    readonly和const 二者的区别
    自定义控件的实现
    sql 分页常见做法
    数据库通用连接类
    log4Net 使用
    NHibernate从入门到精通——第一个NHibernate应用程序
    自己写了一个js,但是最终不能控制住最后后的提交,前面的还是比较完美,大家看到后,能帮我解决一下吗?
  • 原文地址:https://www.cnblogs.com/hubaoyue/p/3760458.html
Copyright © 2011-2022 走看看