前言
作为一名往日OI的玩家,偶然间发现昔日的战友在SJTU-ACM的OJ上面发了几道题,随手点开一题发现一题用的正式赫赫有名的Meet in the Middle算法,于是心血来潮就把这题顺手AC了。
正文
我们首先还是来介绍一下meet in the middle 算法。
Meet in the Middle算法可以看成是搜索算法的一个改进,一般来说用于广搜(BFS),不过如果搜索深度有上限的情况下也可以用深搜。
我们首先假象一个搜索场景
假设从上面的红点开始进行搜索,找一条能通向下面那个红点的路径,每个点都有两条岔路可供选择。
显然如果我们简单的从上面那个点开始BFS,代价是较大的,在最差的情况下,可能需要把整张图的45个节点给走一遍。
当然把搜索的重任全部交给一个节点是不合理的。于是Meet in the Middle算法就诞生了。顾名思义,就是两个节点各自向中间搜索,直至碰头。
在上图中红点的部分为起点开始向外搜索到的点,而蓝点表示从终点开始搜索到的点。假如此时搜索进行到点B,直接就能发现A点是从起点过来的点,那么也就自然找到了一条从 起点->A->B->终点 的路径,然而我们发现,整个图里面黑色部分的节点与边其实我们都可以不用访问。当整张图扩大是,这种优化的效果还是比较明显的。
我们接下来用数学来具体推导一下这种搜索方案的复杂度。
假设向外搜索n层需要的代价为f(n)。如果不用meet in the middle 那么复杂度