hiho一下第190周《震荡数组》题目分析

9
0

《震荡数组》题目分析

这道题是一道搜索题目,30!状态很多,需要一些搜索、剪支技巧才能AC。

首先震荡数组要求A[i]-A[i-1],正负交替。我们不妨规定先正后负,计算一次最少交换次数;然后规定先负后正,再计算一次。

搜索可以用A*算法,减少扩展的状态。A*算法可以参考搜索三·启发式搜索

启发函数H有很多种设计。例如,每次交换A[i]和A[j],会改变4个差值A[i]-A[i-1], A[i+1]-A[i], A[j]-A[j-1], A[j+1]-A[j]。所以 我们可以令H(S) = ceil(S中错误的差值 / 4)。 S是当前状态,所谓错误的差值是指本应是正的,当前是负的;或者本应是负的,但是 当前是正的的差值。

最优化剪支:如果当前状态的估计交换数(H函数估计)不少于当前已知的最优交换次数,就没有必要再搜索下去了。

除了A*搜索之外,还可以使用迭代加深的搜索策略。

BTW,本题之前通过的提交中,有些程序使用了特殊的剪支方法。我不太确定是不是100%正确的,但是也构造不出反例。如果大家有什>么高明的剪支策略欢迎在后面分享~

0 answer(s)

write answer 切换为英文 切换为中文


转发分享