问题来自当地的黑客马拉松: 我有一个按降序排列的正整数排序数组。例如(9,4,2,1)。您可以遍历数组的n个元素以最大化总和(最初n =数组的大小)。当您从头到尾遍历数组时,您可以随时停止并从头开始,但这样做的代价是您从津贴中丢失了1个元素。例如,在这种情况下,最好的方法是9,0,9,4。请注意,我已经停止,丢失了一个元素(因此为0)并再次继续。
我想用动态编程来解决这个问题。我知道如何在O(n ^ 2)中使用DP。我正在寻找一种能够以更好的时间复杂度实现这一目标的算法。
答案 0 :(得分:1)
您不希望在重新启动之间的某个时间间隔内取k个数字,而在重新启动之间的某个其他时间间隔中取k + 2个数字;每次取k + 1总是至少一样好。这意味着,考虑到重启的次数,它会立即清楚模式应该是什么(尽可能均匀)。
在时间O(n)中,可以预先计算数组的每个前缀的总和。然后,在时间O(n)中,迭代所有可能的重启计数,通过检查两个相邻前缀的总和并乘以每个前缀的适当次数来计算每个时间O(1)的总和。 / p>