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

    郭志伟&王扣柱

    具体思路:

    1.假设已经确定了矩形区域的上下边界,比如说上下边界分别为第a行和第c行,接下来确定左右边界

    2.可以把每一列中第a行和第c行之间元素看成一个整体,即求数组(BC[0]......BC[m-1])中和最大一组,其中BC[i]=BC[a-1][i]+...+BC[c-1][i]

    3.枚举矩形上下边界,然后用一位数组情况下的方法确定左右边界,即可得到二维问题的解

    #include<iostream>
    #define INF 466000
    using namespace std;
    int A[4][5]={{1,-2,6,-5,4},{3,2,-1,-3,-4},{5,-1,2,-1,3},{3,1,7,-6,9}};
    int BC(int a,int c,int k)
    {
        int sum=0;
        int i;
        for(i=a-1;i<c;i++)
            sum=sum+A[i][k-1];
        return sum;
    }
    int MaxSum(int n,int m)
    {
        int maximum=-INF,i;
        int a,c,sum=0,All=0;
        for(a=1;a<=n;a++)
        {
            for(c=1;c<=n;c++)
            {
                All=BC(a,c,1);
                sum=BC(a,c,1);
                for(i=2;i<=m;i++)
                {
                    if(sum<0)
                        sum=0;
                    sum+=BC(a,c,i);
                    if(sum>All)
                        All=sum;
                    if(All>maximum)
                        maximum=All;
                }
            }
        }
            return maximum;
    }
    int main()
    {
        
        int max=MaxSum(4,5);
        cout<<max<<endl;
        return 0;
    }

  • 相关阅读:
    Lake Counting
    部分和问题
    迷宫最短路
    sublime 的使用技巧
    数组
    Factorial Trailing Zeroes
    Top K Frequent Elements
    Number of Connected Component in An Undirected Graph
    Zigzag Iterator
    Single Number III
  • 原文地址:https://www.cnblogs.com/guozw/p/3628593.html
Copyright © 2011-2022 走看看