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;
    }
  • 相关阅读:
    [LeetCode]2. Add Two Numbers链表相加
    Integration between Dynamics 365 and Dynamics 365 Finance and Operation
    向视图列添加自定义图标和提示信息 -- PowerApps / Dynamics365
    Update the Power Apps portals solution
    Migrate portal configuration
    Use variable to setup related components visible
    Loyalty management on Retail of Dynamic 365
    Modern Fluent UI controls in Power Apps
    Change screen size and orientation of a canvas app in Power App
    Communication Plan for Power Platform
  • 原文地址:https://www.cnblogs.com/VanRomance/p/3612121.html
Copyright © 2011-2022 走看看