我遇到了以下动态编程问题。
你有一个整数网格(所以包括负数)。找到数字总和最大的矩形。
知道如何为整个矩阵做这件事吗?
我为单个数组解决了它,所以我几乎遵循最长递增子序列所做的事情,但仅适用于连续数字。
def array_largest_block(sequence)
len = sequence.size
parents = [nil]*len
my_largest = sequence
largest = sequence.max
for index in (1...len)
if my_largest[index] < my_largest[index] + my_largest[index - 1]
my_largest[index] = my_largest[index] + my_largest[index - 1]
parents[index] = index - 1
largest = [largest, my_largest[index]].max
end
end
end_index_of_largest_block = my_largest.find_index(largest)
i = end_index_of_largest_block
res = []
res << sequence[i]
while !parents[i].nil?
i = parents[i]
res << sequence[i]
end
return {l_sum: largest, start: i, end: end_index_of_largest_block}
end
所以我的想法是,
- 找到矩阵中每个正方形的总和(仅 1x1 正方形)
- 保存最大值以获得可能的答案
- 从可能的最小矩形开始运行相同的东西并计算所有它们,直到找到最大值。哪个是数据库部分。
有任何想法吗?或者如果你们不知道确切的解决方案,我应该看哪种 DP 类型算法?