【发布时间】:2011-04-04 22:44:38
【问题描述】:
有一个长方形的硬币网格,正面由值 1 表示,反面由值 0 表示。您可以使用 2D 整数数组表(1 到 10 行/列,包括 1 到 10 行/列)来表示。
在每一步中,您选择网格(第 R 行,第 C 列)中的任何单个单元格(R,C)并翻转所有单元格(r,c)中的硬币,其中 r 介于 0 和R(含),c 介于 0 和 C(含)之间。掷硬币意味着将单元格的值从零反转为一或从一反转为零。
返回将网格中的所有单元格变为尾部所需的最小移动次数。这总是可能的。
例子:
1111
1111
returns: 1
01
01
returns: 2
010101011010000101010101
returns: 20
000
000
001
011
returns: 6
这是我尝试过的: 由于抛硬币的顺序无关紧要,在硬币上移动两次就像根本不移动,我们可以找到所有不同的抛硬币组合,并最小化好的组合的大小(好的意思是那些给所有的尾巴)。
这可以通过制作一个由所有硬币组成的集合来完成,每个硬币都由一个索引表示。(即,如果总共有 20 个硬币,这个集合将包含 20 个元素,给它们一个索引 1 到 20)。然后制作所有可能的子集,看看它们中的哪一个给出答案(即,如果在子集中的硬币上移动给了我们所有的反面)。最后,最小化好的组合的大小。
我不知道我是否能够太清楚地表达自己......如果你愿意,我会发布一个代码。 无论如何,这种方法太耗时和浪费,并且对于 no.of coin>20(在我的代码中)是不可能的。 这个怎么办?
【问题讨论】:
标签: c++ algorithm optimization dynamic