将一组分成具有最小移动次数的k组

Leo*_*ard 7 algorithm

您有一组n个对象,其中给出了整数位置.一对象是同一位置的一组对象(不一定是该位置的所有对象:单个位置可能有多个组).对象可以向左或向右移动,目标是移动这些对象以形成k组,并在移动的最小距离的情况下移动.

例如:

  • 初始位置为[4,4,7],k = 3:最低成本为0.
  • [4,4,7]和k = 2:最低成本为0
  • [1,2,5,7]和k = 2:最低成本是1 + 2 = 3

我一直在尝试使用贪婪的方法(通过计算哪个移动最短),但这不起作用,因为每次移动都涉及两个可以移动的元素.我还没有能够制定动态编程方法,但我正在研究它.

Ali*_*Ali 1

据我了解,问题是:

我们在一条线上有 n 个点。我们想在线上放置 k 位置。我称它们为目的地。将 n 个点中的每一个移动到 k 个目的地之一,使距离之和最小。我把这个总和称为总成本。目的地可以重叠。

一个明显的事实是,对于每个点,我们应该寻找左侧最近的目的地和右侧最近的目的地,并选择最近的目的地。

另一个重要的事实是所有目的地都应该在要点上。因为我们可以将它们在线上向右或向左移动以到达某个点,而不会增加总距离。

根据这些事实考虑以下 DP 解决方案:

DP[i][j] 表示当我们只能使用 j 个目的地并且必须将目的地放在第 i 个点时,第 i 个点所需的最小总成本。

计算 DP[i][j] 确定第 i 个点之前的目的地(我们有 i 个选择),并且对于每个选择(例如第 k 个点)计算第 i 个点和添加的新点(第 k 个点)。将其与 DP[k][j - 1] 相加并找到所有 k 的最小值。

初始状态(例如 j = 1)和最终答案的计算留作练习!