【发布时间】:2014-01-26 10:10:23
【问题描述】:
我们有一个如下所示的位数组
{1 0 1 0 0 1 0 1}
上述数组的位数为8
如果我们从[1,5] 取范围,那么[1,5] 范围内的位数是[0 1 0 0 1]。
如果我们翻转这个范围,那么翻转后它将是[ 1 0 1 1 0]
所以翻转[1,5]范围后1的总数是[1 1 0 1 1 0 0 1] = 5
如果我们从[1,6] 取范围,那么[1,6] 范围内的位数是[0 1 0 0 1 0]。
如果我们翻转这个范围,那么翻转后它将是[ 1 0 1 1 0 1]
所以翻转[1,5]范围后1的总数是[1 1 0 1 1 0 1 1] = 6
所以答案是范围[1,6],翻转后我们可以在数组中得到6个1
有没有很好的算法可以解决这个问题。我只考虑动态规划,因为这个问题可以分解成可以组合的子问题。
【问题讨论】:
-
简单的 O(n²) 算法,只需检查所有范围(n 个起点 -> 最大 n 个端点)。
-
我不认为它对downvote有效,因为一旦通过数组和@Zeta你提到O(n2)就可以完成这个算法,这不是最佳方式。
-
我不明白这个问题。在您的示例中,答案不应该是 4 吗?如果你翻转 4 个零,你会得到 8 个,这是最大值。
-
我其实觉得这个问题很有趣。 +1。
-
我认为如果将 1 替换为 -1 并将 0 替换为 1,这会减少到最大子数组问题。
标签: algorithm bit-manipulation dynamic-programming