【问题标题】:Find minimum number of movement找到最小移动次数
【发布时间】:2022-08-24 16:49:52
【问题描述】:

给定一个 1 和 0 的数组。我们需要将所有 1\'s 移动到 0 最小 成本

  1. 我们可以向左或向右移动,多个不能移动到同一位置。

  2. 每次移动成本为 1。

    Ex:
    
        array = 0001101
        
        Here the optimal solution is 5 , x means it cannot be occupied 
        1. 3rd index to 2nd index -> cost = 1 , array = 00xx101  
        2. 4th index to 1st index -> cost = 3 , array = 0xxxx01
        3. 6th index to 5th index -> cost = 1 , array = 0xxxxxx
    

    我通过蛮力方式尝试找到它最接近 0 并移动它,但是 没有成功。在这里需要一些专业知识的帮助。

  • 请分享更多详细信息,例如涉及的代码
  • @Dave我认为OP的问题不等同于您指出的问题。 OP想要摆脱那些(通过将它们移动到零位置)。他不想把 1 和 0 凑到一起。此外,似乎 OP 有一个额外的限制,即在他的途中经过的零(以及一个人的原始位置)不能用于其他人的未来移动。
  • @JohnDoe 同意;我的错。

标签: algorithm data-structures dynamic-programming


【解决方案1】:

这可以通过动态规划来解决。

让状态空间是具有字母 {0, 1, x} 中的 n 个字符的字符串集合。

在将 1 移动到最接近的 0 到左侧或右侧后,通过将 1 和 0 更改为 x 来定义转换。

基本情况是包含 0 和 x 字符的字符串(您返回零)或您无法从中移动的字符串(您返回 -1)。

例如,如果初始状态为 0001101,则可能的转换为 00xx101、0001xx1 和 00011xx。

状态的解决方案是所有可能转换的解决方案中的最小值(加上进行转换的成本),仅适用于非 -1 的解决方案。如果所有转换解都是-1,则状态的解也是-1。

要存储状态的解决方案,您可以使用哈希映射。

【讨论】:

  • 你在这里描述的似乎更像是空间上的 BFS,而不是动态编程。看起来搜索空间可能非常大。你对这将运行多快有任何限制吗?
  • 我所描述的是一种自上而下的动态规划方法,它利用了子问题之间的重叠。我还在贪婪地观察到,唯一有趣的转换是通过在将 1 移动到左侧或右侧最近的 0 之后将 1 和 0 更改为 x 来定义的。这大大减少了搜索空间。我试图估计时间复杂度。我认为这取决于我们如何优化过渡
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2014-04-21
  • 2016-07-03
  • 1970-01-01
  • 2014-10-13
  • 2019-02-27
  • 1970-01-01
相关资源
最近更新 更多