在最小移动中将String转换为良好的字符串

时间:2015-03-06 12:14:46

标签: algorithm dynamic-programming

给定字符串S为0和1,我们需要将其转换为良好的字符串。当且仅当:

时,字符串称为good

没有两个或更多的0或1在一起。这意味着001不好,但010是一个很好的字符串。

现在我们可以交换S的任意两个索引的位置。让位置j与位置j(i≠j)交换的成本为C(i,j)。

现在我们有两种类型的成本计算:

  1. C(I,J)= | J-I |
  2. C(I,J)= | J-I | * | J-I |
  3. 我们需要找到将当前字符串S转换为良好字符串所需的最低交换成本。

    此外,如果无法将字符串S转换为良好的字符串,那么我们也需要告诉它,如果S = 00,那么我们永远不能将它转换为良好的字符串。

    示例:让字符串S = 0011然后如果成本是类型1,那么我们可以交换任意两个位置和成本| j-i |然后回答是1,并且对于类型2成本也是(3-2)^ 2 = 1

    这个问题的DP解决方案可以是| S |< = 10 ^ 5而不是暴力解决方案。请帮助我找到此问题的重复发现,以找到最低成本

1 个答案:

答案 0 :(得分:1)

如果我错了,请纠正,但最多可以有两种解决方案。

如果0和1的数量相等,我们有两个解决方案,一个从0开始,另一个从1开始。否则,只有一个解决方案:开始和结束有大量数字。如果计数差异超过1,则无法解决。

对于每种情况,您都可以轻松计算成本。

EG。如果我们需要在0位置交换1,找到下一个立即额外0并与之交换。这个解决方案是您提到的所有3个案例的最佳选择。