1. 程式人生 > >[專題練習] Part1 搜索

[專題練習] Part1 搜索

new 利用 枚舉 經驗 mil P20 擴展 格子 -s

一.DFS(深度優先搜索)

過於水略過。

二.BFS(廣度優先搜索)

同上。

三.記憶化

記憶化搜索,就是我們的狀態會重復利用,為了防止狀態的重復計算耗費不必要的時間,我們可以把這個狀態的結果記錄下來,然後查詢表中的結果就行了。

一般來所,記憶化搜索是和DP等價的。如果遞推的DP不好寫,可以考慮用記憶化搜索實現,但是因為是遞歸,所以常數略大。記憶化搜索有明顯的優點,就是可以不用考慮狀態在哪裏終止,只用知道狀態會終止就行了。

四.搜索剪枝

這是一門博大精深的學問, 通常用於解決搜索時間復雜度過高的問題。

原理就是在龐大的搜索樹上剪去不可能對答案產生貢獻的枝條。

搜索+剪枝的時間復雜度是$O(玄學)$,因為我們只能通過經驗來估測剪枝效果。

所以考試打暴力的時候一定要多寫剪枝,尤其是奇形怪狀的玄學剪枝(參考i207m某次比賽的$N^2$跑過1e9)。

幾道例題:

1. Noip2015鬥地主 。

貪心出牌,出完順子枚舉出其他的盡可能出的多的牌的組合。

加上最優化剪枝,如果現在出了$ans-1$次沒有出完就剪枝。

2.Noip2009靶形數獨

我當時用了$lowbit$優化常數,然後把整個棋盤分成上下兩部分,如果上半部分空位比下半部分多,就從下半部開始搜索。這樣就睡、水過去了。

其實也可以按格搜索,優先搜可填的少的格。

還有$A*$剪枝,如果剩下的格子都填9還比$ans$小的話就剪枝。

通常使用的剪枝技巧

1.最優性剪枝。

2.$A*$剪枝。

3.改變搜索順序,優先搜索擴展出的狀態比較少的狀態。

五.雙向廣搜

正在研究中...

[專題練習] Part1 搜索