【发布时间】:2021-02-11 02:25:28
【问题描述】:
最近,我遇到了这个问题,我很想知道 1) 我可以将这种类型的问题归类为一个特定的名称,或者 2) 解决这个问题的最佳方法是什么。这有点挑剔,所以请多多包涵,因为我会尽力解释它(为糟糕的绘图提前道歉)。
给定一个代表土壤图的 n x n 矩阵。每个条目都有一个数值,表示使该地块肥沃所需的水量。您可以选择降雨的特定坐标(强度I),降雨面积取决于参数d(始终是偶数) .大 d 意味着更大的面积..
这里是挑剔的部分。
下雨的方式如下图所示。郊区(由虚线绿线表示)的降雨量(I/2)是其对应地区的一半。所以在这种情况下,它将接收 4 毫米。因此,通过决定在点 (3,3) 周围倾盆大雨,边界上将有 7 块土壤(7 块小于或等于 8 / 2 = 4)和内部( 10 个小于或等于 8 的地块)导致总共 17 个土壤变得肥沃。
问题提出,给定 (n x n: 2d int array, d: int, I: int) 的参数,什么是可以肥沃的土壤的最大数量?
n.b.坐标的位置没有限制,即可以在地形的边缘。
我通过以下方式解决了它:
基本上是蛮力,但有一些效率调整。
效率调整 1:根据 d 的值,它包含多少块土壤有一个限制 [d * (d / 2 + 1)]。如果任何点满足最大值,则停止搜索。
效率调整 2:例如,如果 d 的值为 10,那么它的半径将为 5,这意味着它最多会在内部区域内完全覆盖 sqrt(5) 到 sqrt(5)。换句话说,它最多会完全覆盖 2 x 2,因此,我们可以从点 (2, 2) 开始搜索,而不是从 (0, 0) 开始搜索,这会造成不必要的水空地。类似地,我们可以在对角的对角点结束搜索,即 (n - 2, n - 2)。
这个解决方案感觉不是最佳的,因为随着 d 和 n x n 变大,正在计算的土地有很多重叠。
【问题讨论】:
-
“这是什么类型的问题?帮助分类” - 这是一个优化问题。这真的是你要问的吗?
-
顺便说一下,你不应该把它标记为 [java] 或 [kotlin] 因为你(有?)使用的实现语言是不相关的。据我所知。 (如果您向我们展示了代码,并提出了一个关于代码的问题,那么其中一个可能是相关的。但不是两者兼而有之。Java 和 Kotlin 是不同的语言。)跨度>
-
@StephenC 我希望它属于一个更具体的问题系列......如果我能找到类似的问题也很好。我使用递归来区分内部和外部级别,但我从未见过像这样的问题。我只是想了解更多关于这个问题的信息。。
-
因此,如果您希望得到与我给出的答案不同的答案(顺便说一句,这是一个有效的答案),那么您的问题需要更清晰、更明确。 (你最好在scicomp.stackexchange.com 或cs.stackexchange.com 上问这个问题)
-
正式注明。请记住,我问了两个问题。也去掉了标签,干杯。
标签: algorithm