子数组之和的最大值(二维)

来源:互联网 发布:迪奥西斯形态数据 编辑:程序博客网 时间:2024/05/20 04:10

    二维情况下,定义“部分和”PS[i][j]等于以(1,1),(i,1),(1,j),(i,j)为顶点的矩形区域的元素之和。则以(i_min,j_min),(i_min,j_max),(i_max,j_min),(i_max,j_max)为顶点的矩形区域的元素之和,等于PS[i_max][j_max]-PS[i_min-1][j_max]-PS[i_max][j_min-1]+PS[i_min-1][j_min-1]。(可以想象)。对于求解部分和,也能以O(1)时间得到新的部分和,PS[i][j]=PS[i-1][j]+PS[i][j-1]-PS[i-1][j-1]+B[i][j],其中B[i][j]为矩阵中第i行第j列的元素(下标从1开始)。因此用O(N*M)时间复杂度可以处理所有部分和。故算法总时间复杂度为O(N*N*M*M)。

    进一步解法:枚举矩形上下边界(左右也可以),然后用一维情况下的方法确定左右边界,就可以得到二维问题的解(将BC(a,c,i)看成是一维里的一个元素)。新方法时间复杂度为O(N*N*M)。BC(a,c,i),表示在第a行和第c行之间的第i列的所有元素的和,显然可以通过“部分和”在O(1)时间内计算出来,它等于PS[c][i]-PS[a-1][i]-PS[c][i-1]+PS[a-1][i-1]。(这些PS在前面的计算中以及获得)

通过选择枚举上下或左右可以使时间复杂度变为O(N*M*min(N,M))。
原创粉丝点击