• 求一个二维数组的最大子数组


    小组成员:周其范  胡宝月

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

    对于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;
    }
    复制代码
  • 相关阅读:
    常用的SQL语句
    解决Pycharm中module 'pip' has no attribute 'main'的问题
    [转]如何使用Fiddler抓取指定浏览器的数据包
    Linux常用命令
    Android:JACK编译错误汇总及解决
    Linux学习:使用 procrank 测量系统内存使用情况
    Android:动态库(.so)调试技巧
    Android 显示系统:Vsync机制
    Android:cmake开发指南
    Android:高通平台性能调试
  • 原文地址:https://www.cnblogs.com/hubaoyue/p/3760458.html
Copyright © 2020-2023  润新知