我解决这个问题的方式非常低效。
我的解决方案:我发现,对于4x4网格(2d数组)中的每个值,3x3网格的值为中心。然后我将这个网格相加,添加到一个数组中,然后每发现一个3x3网格,我就找到了新数组中的最大总和。
根据我的教授的说法,这是“我们正在使用的网格尺寸的精细解决方案”。但是存在一个更有效的解决方案,他给了我提示
提示更有效的解决方案:“一个可能有用的提示:将其视为最大化二维积分,将网格视为(行,列)的函数。”
要明确的是,我的解决方案得到了充分的信任。我完全迷失了如何开始编写更有效的解决方案。
答案 0 :(得分:2)
以下是NxM
时间和空间中O(N * M)
网格的一般解决方案。
我们假设网格的大小为NxM
,我们必须找到最大总和AxB
的{{1}}网格。
可以预先计算数组(1 <= A <= N, 1 <= B <= M)
=所有元素的总和,其中索引为sum(x, y)
和1 <= i <= x
(1 <= j <= y
,其中sum(x, y) = sum(x - 1, y) + sum(x, y - 1) - sum(x - 1, y - 1) + a(x, y)
是初始网格。
然后,对于所有有效a
和max(sum(x, y) - sum(x, y - B) - sum(x - A, y) + sum(x - A, y - B))
,答案为x
。
此解决方案不考虑网格可以环绕但可以轻松修复的事实:使用新的网格y
,如下所示:
2Nx2M
上述算法找到的这个网格的答案是回绕最初问题的答案。