【发布时间】:2011-01-21 05:20:39
【问题描述】:
有一个由 M 个二进制数组成的数组,每个二进制数都处于“0”或“1”状态。您可以执行几个步骤来更改数字的状态,并且在每个步骤中,您都可以更改恰好 N 个连续数字的状态。当然,给定数字 M、N 和包含成员的数组,您将要计算将所有二进制数转换为一种状态(1 或 0)所需的最小步骤数。
如果 M = 6 且 N = 3 且数组为 1 0 0 1 0 0,则解将为 2。 说明:我们可以分两步翻转它们,使它们都为 1:我们从索引 2 翻转到 4,然后将数组转换为 111000,然后将最后三个 (N) 翻转为 1。
【问题讨论】:
-
1.这是作业吗? 2. M 和 N 有多大? (例如,O(M 2^N) 算法会起作用吗?) 3. 你的英语非常好。我不认为这个问题有一个著名的标题。
-
问题是否保证总有解决方案?例如,对于 1 0 1 和 N = 3,没有解决方案。算法是否应该考虑这些情况?
-
如果你尝试这个问题,在你的问题中输入一些代码或伪代码,然后请求 cmets,你可能会得到更多的响应。
-
M 和 N 在 1-100000 的范围内,因此暴力破解不会以任何可能的方式工作。这是一个动态规划问题,应该这样解决。
-
@thebretness:如果我有任何可能的想法,我不会在这里发帖——我会尝试一下,看看我得到了什么。问题是我不知道任何可能的方法来解决这个问题。 @Ivlad:你是对的,不会总是有解决方案,所以输出将是 -1 或 smth。
标签: c++ algorithm dynamic-programming