您将获得一个N X M
矩形字段,其左下角位于原点。你必须在田地里建造一个带方底的塔。在该领域有树木与相关的成本连根拔起。因此,您必须尽量减少连根拔起的树木数量,以最大限度地降低建造塔楼的成本。
示例输入:
N = 4
M = 3
Lenght of side of Tower = 1
Number of Trees in the field = 4
1 3 5
3 3 4
2 2 1
2 1 2
输入中的4行是树的坐标,连根拔除的成本为第三个整数。
与塔的边缘重合的树被认为放置在塔内并且也必须连根拔起。
我在为这个问题制定动态规划关系时遇到了问题
感谢
答案 0 :(得分:3)
听起来你的问题归结为:找到具有最小总和的MxN矩阵的KxK子块。您可以使用积分变换有效地解决此问题(与输入的大小成比例)。当然,这并不一定能帮助您解决动态编程问题 - 我不确定这个解决方案是否等同于任何动态编程公式....
无论如何,对于原始矩阵(a,b)
的每个索引对M
,计算“整数变换”矩阵I[a,b] = sum[i<=a, j<=b](M[i,j])
。这可以通过按顺序遍历矩阵来计算,参考从前一行/列计算的值。 (有一点想法,你也可以用稀疏矩阵有效地做到这一点)
然后,您可以将常量时间内任何子块(a1..a2, b1..b2)
的总和计算为I[a2,b2] - I[a1-1,b2] - I[a2,b1-1] + I[a1-1,b1-1]
。迭代所有KxK子块以找到最小的和将花费与原始矩阵的大小成比例的时间。
由于原始问题被表述为积分坐标列表(并且,可能希望塔位置作为整数坐标对输出),您可能需要将您的场表示为稀疏矩阵以获得有效的解决方案 - 这涉及按字典顺序对树木的坐标进行排序(例如,首先按x
- 坐标,然后按y
- 坐标)。请注意,此排序步骤可能会O(L log L)
输入大小为L
的大小,主导以下步骤,这些步骤仅占输入大小的O(L)
。
另请注意,由于指定“与塔边缘重合的树木被连根拔起......”的问题,边长为K的塔实际上对应于(K+1)x(K+1)
子块。