我们有两个定向序列,
例如(+A-) (-B+) (+C-) (-D+) (+E-) and (+B-) (+C-) (-D+) (+E-) (+A-)
。
请注意,(+A-)
表示面向子序列,其中'+'
表示子序列的头部,'-'
表示尾部。如果'1234'
为(+A-)
,则'4321'
为(-A+)
,与(+A-).
目标是找到将序列更改为另一个序列的最小步骤数,只进行反向操作。
例如,我们需要反转一次才能更改(+A-)(+B-) to (-B+)(-A+).
我们需要反转两次以更改(+A-) (+B-) (+C-) to (-A+) (+B-) (-C+).
首先给出的两个序列之间的最小操作步数是3.这是一种方法:
步骤0.(+ A-)( - B +)(+ C - )( - D +)(+ E - )
步骤1. (+ B-)( - A +)(+ C-)( - D +)(+ E-)
步骤2.(+ B-)( - A +)( - E +)(+ D-)( - C +)
步骤3.(+ B-)(+ C-)( - D +)(+ E - )(+ A - )
我的想法是问题可能与排序问题有关,但不是在序列中交换两个单独的元素,这里我们必须考虑交换两个子序列。
答案 0 :(得分:0)
您可以尝试的一种方法是考虑一个函数g,它计算序列中两个相邻元素未正确连接的所有位置。
所以在您的原始示例中,目标为:
Start (+B-) (+C-) (-D+) (+E-) (+A-) End
我们考虑原始序列中的每对元素:
Start (+A-) (-B+) (+C-) (-D+) (+E-) End ->
Start (+A-) Incorrect because Start should be followed by +B
(+A-) (-B+) Incorrect because A- should be followed by End
(-B+) (+C-) Incorrect because B+ should be followed by Start
(+C-) (-D+) Correct
(-D+) (+E-) Correct
(+E-) End Incorrect because E- should be followed by +A
所以这得分为4分不正确。
每当你反转一个子串时,你改变最多2个相邻元素的状态,所以最多得分将减少2。
在你的例子中我们有:
步骤0. x(+ A-)x(-B +)x(+ C-)( - D +)(+ E-)x得分4
步骤1.(+ B-)x(-A +)x(+ C-)( - D +)(+ E-)x得分3
步骤2.(+ B-)x(-A +)( - E +)(+ D-)( - C +)x得分2
步骤3.(+ B-)(+ C - )( - D +)(+ E-)(+ A-)得分0
由于原始得分为4,我们确信至少需要2次掉期(因为得分每步最多可减少2次),而您的解决方案使用3次,所以我们只需要检查替代方案为了排除更好的解决方案,每一步的分数减少2。
有一种众所周知的算法可用于执行此类搜索,它被称为A star search。
对于这种类型的搜索,您需要一个允许的启发式方法,它永远不会过高估计与目标的距离。我建议您尝试使用0.5 * g给出的启发式解决问题。