我尝试过考虑算法,但是无法做到。这是问题所在:
有16个元素,按四种类型(a,b,c和d)分组。我们还有四个组,A,B,C和D.
在初始状态下,四个组各有四个随机元素,例如:
A: c, c, a, d
B: b, b, a, a
C: b, b, c, c
D: d, d, d, a
组中元素的顺序很重要。
允许两种操作:
1)旋转组的元素(在两个方向上),例如:
c, c, a, d -> d, c, c, a
2)考虑到第一个和最后一个组和元素也是相邻的,在一个组中交换两个相邻元素与相邻组中的相应元素,所以。:
A: (c, c), a, d
B: (b, b), a, a
->
A: (b, b), a, d
B: (c, c), a, a
或
A: c), c, a, (d
D: d), d, d, (a
->
A: d), c, a, (a
D: c), d, d, (d
算法的目标是将元素放入相应的组(A: a, a, a, a
等)。算法在时间和解决方案上不一定是最优的,但平均来说应该相当快(即没有暴力)。
有人可以帮忙吗?这个算法甚至是多项式的吗?
答案 0 :(得分:4)
我认为这总是可能的。首先考虑一个字母(比如说b)只出现在X和Y两行中的情况。我们可以通过交换操作确保X和Y相邻。
案例i)
X: b - - -
Y: - b b b
我们可以通过
制作X全部bCyclich shift X。
X: - - b -
Y: - b b b
交换中间
X: - b b -
Y: - - b b
现在循环移位和交换。
案例ii)
X: b - b -
Y: b - b -
制作
X: - b - b
Y: b - b -
交换最后两个。
另一种情况很简单。
现在给出2,3或4行中特定字母的任何分布,我们可以确保它只出现在两行中。我会把它留给你,因为它很容易看到,很难打字!
(如果它只出现在一行中,我们的工作主要是为那封信完成的)
因此算法将
确保仅显示两行。确保行是A和B(稍后交换)。
现在执行以上操作以使A成为aaaa。
忽略A。
考虑B,C,D。确保b仅出现在两行中。如上所述使B成为bbbb。
忽略B。
给定C和D,你可以使用上面的命令使C成为cccc,D将是dddd。
答案 1 :(得分:1)
我最初的想法是尝试某种形式的动态编程 - 问题似乎与Edit Distance相似,因为你有一组有限的操作和一个已知的所需最终状态。动态编程方法将产生多时间算法。但是,就像我说的,这就是我开始搜索算法的地方,我不知道这种方法是否真的有效。如果我稍后再过一段时间,我会有更深入的思考。
希望这有帮助!