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;
    }
    复制代码
  • 相关阅读:
    WCF 、Web API 、 WCF REST 和 Web Service 的区别
    BusyIndicator using MVVM 忙碌状态指示器的的实现
    复制文件夹的方法 .net
    SQL/LINQ/Lamda
    CSLA验证规则总结
    C++中GB2312字符串和UTF-8之间的转换
    如何用VC编写供PB调用的DLL
    【转】lucene4.3.0 配置与调试
    cygwin主要命令
    【转】eclipse中window->preference选项中没有tomcat的解决方法
  • 原文地址:https://www.cnblogs.com/hubaoyue/p/3760458.html
Copyright © 2011-2022 走看看