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

标签 java arrays grid integration mathematical-optimization

我解决这个问题的方法效率很低。

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

据我的教授说,这是“针对我们正在使用的网格大小的完美解决方案”。但是存在一个更有效的解决方案,他给了我提示

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

需要说明的是,我的解决方案获得了满分。我完全不知道如何开始编写更高效的解决方案。

最佳答案

这是 NxM 的通用解决方案网格 O(N * M)时间和空间。 让我们假设网格有 NxM大小,我们必须找到 AxB总和最大的网格 (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))对于所有有效的 xy . 此解决方案未考虑网格可以环绕但可以轻松修复的事实:使用新网格 2Nx2M看起来像:

aa
aa

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

关于java - 如何在随机生成的 4x4 网格中找到总和最高的 3x3 网格(取模网格,可以环绕),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21437362/

相关文章:

java - Hibernate 4.2.2 在插入 @OneToMany 集合时不验证实体

python - 用零填充行,其他列有一些值,否则其他列没有值,在 python pandas 中用 NaN 填充它

.net - 为什么复制对字符串的引用比复制整数慢得多(对于 Array.Copy(),反之亦然)?

javascript - JS : Is there a way to make a cell in a grid not clickable?

java - JSlider 最后的值

Java定时器和绘图动画

java - 何时使用请求作用域的 bean 与在堆栈中传递参数?

c++ - 初始化多维数组中的所有位置?

java - 在 SWT 网格上拖放

html - 为什么我的第一个对象比网格 CSS 中的其他对象大