通过贪婪算法找到最小移动次数

finding the min number of moves by greedy algorithm

本文关键字:移动 贪婪 算法      更新时间:2023-10-16

有一个二维网格,其中包含随机单元格中的巧克力。一举一动,我可以把一行或一列中包含的所有巧克力都拿走。拿走所有巧克力所需的最小动作次数是多少?

示例:包含巧克力的单元格是:

0 0
1 1
2 2

最小移动次数 =3

0 0
1 0
0 1

最小移动次数=2

我想这个问题有一个贪婪的算法解决方案。但是如何处理这个问题呢?

我认为这是经典的集合封面问题的变体,它被证明是NP困难的。

因此,贪婪算法只能得到近似值,而不能得到最优解。

对于这个特定问题,它不是NP难的。它可以在多项式时间内求解。解决方案如下:

将 2D 网格转换为二分图。左侧包含表示行的节点,右侧包含表示列的节点。对于每个包含巧克力的单元格,假设它的坐标是 (x,y),添加一个链接row_x和column_y的边。二分图建立后,使用匈牙利算法获得最大匹配。由于在二分图中,最大匹配的答案等于最小顶点覆盖,因此答案正是您想要的。

匈牙利算法是一种 O(V*E) 算法。有关更多详细信息,请参阅匈牙利算法

有关二分图的更多信息,请参考二分图,您可以在此处找到为什么最大匹配等于最小顶点覆盖。

PS:这既不是贪婪的问题,也不是动态编程的问题。这是一个图形问题。