搜索是OI之路上,人人必会的强大算法。自古便有名言:“搜索进省队,打表能AK”。在考场上,搜索常常是与正解的对拍板子(当然有时搜索就是正解),且一般搜索都会有20~30分。而想要写好搜索,剪枝必不可少。
what is 剪枝?
常用的搜索有Dfs和Bfs。Bfs的剪枝通常就是判重,因为Bfs寻找的是步数最少,重复的话必定不会在之前的情况前产生最优解。深搜,它的进程近似一颗树(通常叫Dfs 树),而剪枝就是一种生动的比喻:把不会产生答案的,或不必要的枝条“剪掉”。剪枝的关键就在于剪枝的判断:什么枝该剪,什么枝不该剪。
剪枝的原则?
正确性,准确性,高效性。
常用的剪枝有:可行性剪枝、最优性剪枝、记忆化搜索。
1.可行性剪枝。
如果当前条件不合法就不再继续搜索,直接return。这是非常好理解的剪枝,搜索初学者都能轻松地掌握,而且也很好想。一般的搜索都会加上。
一般格式:
dfs(int x)
{
if(x>n)return;
if(!check1(x))return;
....
return;
}
2.最优性剪枝。
如果当前条件所创造出的答案必定比之前的答案大,那么剩下的搜索就毫无必要,甚至可以剪掉。我们利用某个函数估计出此时条件下答案的‘下界’,将它与 已经推出的答案相比,如果不比当前答案小,就可以剪掉。
一般格式ÿ