如何在随机生成的4x4网格中找到最高和3x3网格(模数网格,可以环绕)

时间:2014-01-29 16:48:59

标签: java arrays grid integration mathematical-optimization

我解决这个问题的方式非常低效。

我的解决方案:我发现,对于4x4网格(2d数组)中的每个值,3x3网格的值为中心。然后我将这个网格相加,添加到一个数组中,然后每发现一个3x3网格,我就找到了新数组中的最大总和。

根据我的教授的说法,这是“我们正在使用的网格尺寸的精细解决方案”。但是存在一个更有效的解决方案,他给了我提示

提示更有效的解决方案:“一个可能有用的提示:将其视为最大化二维积分,将网格视为(行,列)的函数。”

要明确的是,我的解决方案得到了充分的信任。我完全迷失了如何开始编写更有效的解决方案。

1 个答案:

答案 0 :(得分:2)

以下是NxM时间和空间中O(N * M)网格的一般解决方案。 我们假设网格的大小为NxM,我们必须找到最大总和AxB的{​​{1}}网格。 可以预先计算数组(1 <= A <= N, 1 <= B <= M) =所有元素的总和,其中索引为sum(x, y)1 <= i <= x1 <= j <= y,其中sum(x, y) = sum(x - 1, y) + sum(x, y - 1) - sum(x - 1, y - 1) + a(x, y)是初始网格。 然后,对于所有有效amax(sum(x, y) - sum(x, y - B) - sum(x - A, y) + sum(x - A, y - B)),答案为x。 此解决方案不考虑网格可以环绕但可以轻松修复的事实:使用新的网格y,如下所示:

2Nx2M

上述算法找到的这个网格的答案是回绕最初问题的答案。