我目前正在处理以下问题:
给定一个M个正数的数组,我需要得到N个具有一定长度的连续数字块。例如,当我有数组时:
6 9 3 2 8 1 6 9 7
当我需要找到一个长度为3的块时,解决方案是[3,2,8],它的最小总和为13.当我需要找到两个块时,算法应该给出[3,2, 8]和[1,6,9],因为这些块中所有元素的总和是最小的(29)。假设序列的长度总是严格大于块长度的N倍(因此总有一个解决方案)。
我认为这个问题可以通过使用DP解决,但我目前看不出如何。我很难找到子问题之间的经常性关系。有人能帮我一把吗?
提前致谢!
答案 0 :(得分:6)
计算具有给定长度的每个块的总和,并使用初始索引记录它们。这可以通过O(n)
的复杂性来完成。所以你得到一个像这样的清单:
index sum
0 18
1 14
2 13
... ...
由于目标块不能相互重叠,因此它们的索引的每个差异都不能小于给定的长度。因此,您需要在列表中应用简单的动态规划算法。
如果块长度为l
,则列表长度为n
(比如列表S[n]
),并且您要查找m
块,然后
F(n,m,l) = min { F(n-i-l,m-1,l) + S[n-i] } (for i = 0 ~ n-(m-1)*l)
此步骤的复杂性为O(nm)
,其中m
是您想要的块数。
最后,复杂性为O(nm)
。如果您需要更多详细信息,请与我们联系。